最近我试图开始学习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);
}
}
}
答案 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个签名。