C程序生成奇数输出

时间:2015-09-24 20:25:22

标签: c

最近我试图开始学习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);
        }
    }
}

2 个答案:

答案 0 :(得分:6)

该行

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

看起来会将'3'转换为int 3,但事实并非如此。它的作用是取'3'的ASCII值并将其分配给int

修复它,你的程序运行正常:)

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

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

以上行更正后,您的程序输出:

  

下一个最大数量:2032807552
  下一个最大数量:2084481664
  下一个最大数量:2141716480
  下一个最大数量:2144206848

答案 1 :(得分:0)

您可以使用atoi(),atol()例如..将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个签名。