0

これは、ほとんどの変数が int である多くの場合で機能しましたが、たとえば 45 に追加される 10 桁の数字をすべて見つけたい場合を除き、ゼロの出力が得られました。次に、すべての変数を long に変更して違いがあるかどうかを確認しましたが、違いはありませんでした。私が何をすべきか、または現在間違っているかについて何か考えはありますか?

どんな助けでも大歓迎です。

私のプログラムは次のとおりです。

long add_digits(long);
int main()
{
  long digit, i, j, limit, l, n, sum=0, rem, result, counter=1;
    printf("\nInput digits: ");
    scanf("%d", &j);
    printf("\nInput number: ");
    scanf("%d", &i);
    limit=pow(10,j);
    for(n=1; n<limit; n++)
    {
        result = add_digits(n);
        if(result==i)
             counter++;

        }
    printf("\n%d\n", counter-1);
  return 0;
}
long add_digits(long n)
{
  static long sum = 0;
  if (n == 0) {
    return 0;
  }
  sum = n%10 + add_digits(n/10);
  return sum;
}
4

3 に答える 3

0

他の人が指摘したように、pow()呼び出しが問題の鍵です。で動作しdouble、 を返しdoubleます。おそらく、結果をプラットフォームの 32 ビット整数に入れます。10^10 は 32 ビットに収まりません。これは問題の一部です。もう 1 つの部分は精度です。int を double に等しくすると、この質問のような問題が発生する可能性があります。

したがって、ここで行う最も簡単なことは、おそらく 10 を要求された累乗に「手で」 (単純なforループ) 上げ、他の人がより多くの数字を表現できるように提案したように 64 ビット型を使用することです。

(pow の結果を適切に丸めようとするかもしれませんが、大きな数を使用すると、最下位の桁で精度が失われる可能性があり、ループを間違った回数実行するという点に再び到達することに注意してください)

于 2013-10-22T16:47:27.787 に答える