我试图在项目euler click here上使用C来解决问题 这是代码。它适用于10个值,但对于1000个值,它会产生错误的输出。我注意到它提供了正确的输出直到32.我想我已经超出了记忆或其他东西。如何为这么大的阵列分配内存?
#include <stdio.h>
int main() {
int a[10], i, sum=1, b=0;
for(i = 1; i < 10; i++) {
a[0] = 1;
a[i] = sum + a[i-1];
sum = sum + a[i-1];
}
for(int j = 1;j > 0; j++) {
b = b + sum%10;
if(sum<10)
break;
sum = sum/10;
}
printf("%d\n",b);
return 0;
}
答案 0 :(得分:4)
您可以尝试将2 1000 计算为80位long double
,然后使用sprintf
将其转换为字符串,然后对该字符串的数字求和。 / p>
为什么会这样:
浮点类型将数字存储为尾数乘以指数。指数总是2的幂,尾数可以是1.对于long double
,指数最多可以为2 16383 。 printf
和朋友们,在现代实现中,将正确地打印出浮点数的数字。
代码:
int main() {
char buf[1024]; int ans = 0;
sprintf(buf, "%.0f", 0x1.0p1000);
for (int i = 0; buf[i]; i++) ans += buf[i] - '0';
printf("%i\n", ans);
}
答案 1 :(得分:2)
我注意到它提供了正确的输出直到32
也就是说,因为你使用的整数类型有32位。它根本无法容纳更大的数字。你无法用传统方式解决它。
以下是我的建议:首先让我们估计一下这个数字的位数。每当一个数字以十进制写入10倍时,就需要一个新的数字。因此,十进制数字的位数由ceil(log10(n))给出。所以对于2 ^ 1000你需要ceil(log10(2 ^ 1000))个数字,但这只是ceil(1000 * log10(2))= 302,所以你需要302个十进制数字来记下它。
这给出了下一个想法:记下302个数字中的数字1,即字符串中的301次“0”和“1”。然后将字符串加倍1000倍,将其添加到自身,就像在小学一样,带有溢出的数字。
编辑我想我应该指出,遇到的问题是Project Euler问题的重点。项目欧拉问题都有共同点,你无法通过使用天真的编程方法解决它们。你必须有创意来解决它们!