3
#include <stdio.h>
#include <conio.h>

int main()
{
  long signed fact=1;

  int c, n ;

  printf("Factorial to be calculated: ");
  scanf("%d", &n);

  for (c = 1; c <= n; c++)
  fact = fact * c;

  printf("Factorial of %d = %ld\n", n, fact);
  getch();
  return 0;
}

上記の C プログラムを実行すると、13 が得られません。正しい。出力は 12 に当てはまります。これを修正するにはどうすればよいですか? 13には長い無署名で十分だと思いました。

4

2 に答える 2

6

longプラットフォームが 32 ビットである可能性があります ( の値を出力することで確認できますsizeof(long))。13!2^32-1 (32 ビットの符号なし値の最大値) より大きいため、オーバーフローします。

代わりにuint64_t(from )を使用してみてください。<stdint.h>

于 2013-01-18T00:47:48.460 に答える
3

longOli の言ったことは正しいです。C 標準では、少なくとも 32 ビットであることを保証しています。一部のプラットフォームでは、それ以上になる場合があります。

を使用できますunsigned long long。これは少なくとも 64 ビットですが、最大 20! までしか計算できません。

C FAQ には、整数サイズに関する優れた概要があります。使用する整数型をどのように決定すればよいですか? おそらく、任意精度のライブラリを探す必要があるでしょう。

それ以外の場合、より大きな階乗のみを近似したい場合は、スターリングの公式を使用できます。

于 2013-01-18T01:29:37.297 に答える