-1

プロジェクトeulerで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;
 }
4

2 に答える 2

4

2 1000を 80 ビットとして計算long doubleし、 を使用sprintfして文字列に変換し、その文字列の数字を合計してみてください。

これが機能する理由:

浮動小数点型は、数値を仮数×指数として格納します。指数は常に 2 のべき乗であり、仮数は 1 にすることができます。 a の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);
}
于 2013-03-10T22:44:43.337 に答える
2

32まで正しい出力が得られることに気づきました

つまり、使用している整数型は32ビットであるためです。それ以上の数を保持することはできません。従来の方法では解決できません。

これが私が提案することです:最初にその数が何桁になるかを見積もりましょう。数値が10進数で10倍になるたびに、新しい桁が必要になります。したがって、10進数の数値の桁数は、ceil(log10(n))で与えられます。したがって、2 ^ 1000の場合、ceil(log10(2 ^ 1000))桁が必要ですが、それはceil(1000 * log10(2))= 302であるため、書き留めるには10進数の302桁が必要です。

これにより、次のアイデアが得られます。数字の1を302桁で書き留めます。つまり、301×「0」と1つの「1」を文字列に書き留めます。次に、小学校のように文字列を1000回追加して、あふれている数字を運びます。


編集私が指摘すべきだと思うのは、遭遇した問題はこのプロジェクトオイラー問題の要点です。プロジェクトオイラーの問題にはすべて共通点があり、単純なプログラミング方法を使用してそれらを解決することはできません。あなたはそれらを解決するために創造的にならなければなりません!

于 2013-03-10T22:56:58.637 に答える