在C中分配大内存(Project Euler Prob)

时间:2013-03-10 17:14:24

标签: c arrays math memory-management

我试图在项目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;
 }

2 个答案:

答案 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问题的重点。项目欧拉问题都有共同点,你无法通过使用天真的编程方法解决它们。你必须有创意来解决它们!