简体   繁体   English

C程序生成奇数输出

[英]C Program Generates An odd output

Recently I have tried to start learning C, and decided to do some of the project Euler challenges. 最近,我尝试开始学习C,并决定做一些项目Euler挑战。 I wrote this code to solve the problem, however when it is run it outputs numbers that should be impossible. 我写了这段代码来解决这个问题,但是当它运行时,它输出的数字应该是不可能的。 I have tried everything to fix it. 我已经尽力解决了。 Including making some of my ints long, none of this seems to work. 包括使我的一些积分变长,这些似乎都不起作用。 Any input would be great, thanks! 任何输入都会很棒,谢谢!

#include <stdio.h>

int main(){
    char num[] = 
"73167176531330624919225119674426574742355349194934"
"96983520312774506326239578318016984801869478851843"
"85861560789112949495459501737958331952853208805511"
"12540698747158523863050715693290963295227443043557"
"66896648950445244523161731856403098711121722383113"
"62229893423380308135336276614282806444486645238749"
"30358907296290491560440772390713810515859307960866"
"70172427121883998797908792274921901699720888093776"
"65727333001053367881220235421809751254540594752243"
"52584907711670556013604839586446706324415722155397"
"53697817977846174064955149290862569321978468622482"
"83972241375657056057490261407972968652414535100474"
"82166370484403199890008895243450658541227588666881"
"16427171479924442928230863465674813919123162824586"
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408"
"07198403850962455444362981230987879927244284909188"
"84580156166097919133875499200524063689912560717606"
"05886116467109405077541002256983155200055935729725"
"71636269561882670428252483600823257530420752963450";

    int inc;
    long int next_biggest = 0;
    for (inc = 0; inc <= 986; inc++){
        int temp;
        long int total = (int)num[inc];
        for (temp = 1; temp <= 13; temp++){
            total *= (int)num[(inc + temp)];
        }
        if ((total > next_biggest)){
            next_biggest = total;
            printf("Next Biggest Number: %ld\n", total);
        }
    }
}

The line 线

long int total = (int)num[inc];

looks like it converts '3' into an int 3, but it does not. 看起来像它将'3'转换为一个int 3,但没有。 What it does is it takes the ASCII value of the '3' and assigns it to your int . 它的作用是将ASCII值'3'分配给int

Fix it and your program would run fine :) 修复它,您的程序可以正常运行:)

long int total = num[inc] - '0';

Essentially what is happening here is we get a char value (which is a digit) and get its ASCII code. 本质上,这里发生的是我们获得一个char值(一个数字)并获得其ASCII码。 Then, based on the fact that in ASCII all the digits are in one contiguous block of values that begins with '0' we calculate the face value of that digits and use it as an int . 然后,基于以下事实:在ASCII中,所有数字都位于一个以'0'开头的连续值块中,我们计算出这些数字的面值并将其用作int

Here's the output of your program once the above line is corrected: 纠正上述行后,这是程序的输出:

Next Biggest Number: 2032807552 下一个最大数字:2032807552
Next Biggest Number: 2084481664 下一个最大数字:2084481664
Next Biggest Number: 2141716480 下一个最大号码:2141716480
Next Biggest Number: 2144206848 下一个最大编号:2144206848

You can use atoi(), atol() eg.. to convert a char or array or chars to a single int or long type. 您可以使用atoi(),atol()例如..将一个char或一个或多个char转换为单个int或long类型。

http://www.cplusplus.com/reference/cstdlib/atoi/ http://www.cplusplus.com/reference/cstdlib/atoi/

You can do it like this and it will work: 您可以这样操作,它将起作用:

#include <stdio.h>
#include <stdlib.h>

char buffer[256] = {"123456"};
char i = buffer[3];
printf("%d", atoi(&i) );

Soo I would do it like this: 如此,我会这样做:

int inc;
char convert;
long int next_biggest = 0;
for (inc = 0; inc <= 986; inc++){
    int temp;
    convert = num[inc];
    long int total = atol(&convert);
    for (temp = 1; temp <= 13; temp++){
        convert = num[(inc + temp)];
        total *= atol(&convert);
    }
    if ((total > next_biggest)){
        next_biggest = total;
        printf("Next Biggest Number: %ld\n", total);
    }
}

So the basic idea is like.. I haven't tested but it should work like this. 所以基本的想法是..我还没有测试,但是它应该像这样工作。 using ATOL for long. 长期使用ATOL。 Note, you don't need a long with the single characters. 请注意,您不需要很长的单个字符。 Single characters are usually never over 255 unsigned and 128 signed. 单个字符通常永远不会超过255个无符号和128个有符号。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM