簡単な手順で、階乗数を計算します。コードは次のとおりです。
int calcFactorial(int num)
{
int total = 1;
if (num == 0)
{
return 0;
}
for (num; num > 0; num--)
{
total *= num;
}
return total;
}
さて、これはほとんどの数でうまく機能します(より迅速でエレガントなソリューションは確かにありますが、これは私にとってはうまくいきます)。ただし、250 などの大きな数値を入力すると、率直に言って、クラップアウトします。ここで、参考までに、250 の最初の 2 つの階乗 "ビット" は { 250, 62250, 15126750, 15438000, 3813186000 } です。
私のコードは { 250, 62250, 15126750, 15438000, -481781296 } を吐き出しますが、これは明らかにオフです。私が最初に疑ったのは、おそらく 32 ビット整数の限界を超えたのではないかということでしたが、2^32 が 4294967296 であることを考えると、そうは思いません。考えられる唯一のことは、おそらく符号付き32 ビットの制限に違反しているということですが、この種のことを考えられるべきではないでしょうか? 署名されていることが問題である場合、整数を符号なしにすることでこれを解決できますが、次の反復で 938043756000 が生成され、4294967296 の制限をはるかに超えるため、これは一時的な解決策にすぎません。
それで、私の問題は署名された制限ですか?もしそうなら、この問題に再び遭遇することなく、大きな数を計算するにはどうすればよいですか (私は少し前に作成した「LargeInteger」クラスを持っていますが)、この問題に再び遭遇することはありませんか?