繁体   English   中英

C程序生成奇数输出

[英]C Program Generates An odd output

最近,我尝试开始学习C,并决定做一些项目Euler挑战。 我写了这段代码来解决这个问题,但是当它运行时,它输出的数字应该是不可能的。 我已经尽力解决了。 包括使我的一些积分变长,这些似乎都不起作用。 任何输入都会很棒,谢谢!

#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);
        }
    }
}

线

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

看起来像它将'3'转换为一个int 3,但没有。 它的作用是将ASCII值'3'分配给int

修复它,您的程序可以正常运行:)

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

本质上,这里发生的是我们获得一个char值(一个数字)并获得其ASCII码。 然后,基于以下事实:在ASCII中,所有数字都位于一个以'0'开头的连续值块中,我们计算出这些数字的面值并将其用作int

纠正上述行后,这是程序的输出:

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

您可以使用atoi(),atol()例如..将一个char或一个或多个char转换为单个int或long类型。

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

您可以这样操作,它将起作用:

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

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

如此,我会这样做:

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);
    }
}

所以基本的想法是..我还没有测试,但是它应该像这样工作。 长期使用ATOL。 请注意,您不需要很长的单个字符。 单个字符通常永远不会超过255个无符号和128个有符号。

暂无
暂无

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

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