私は大きな数字linkの階乗を計算するには、次の機能を以下の午前、と私はいくつかのものが起こっている理由をもう少し理解したいと思います(長い数の階乗を計算)...中止トラップ:6
#include<stdio.h>
#define MAX 10000
void factorialof(int);
void multiply(int);
int length = 0;
int fact[MAX];
int main(){
int num;
int i;
printf("Enter any integer number : ");
scanf("%d",&num);
fact[0]=1;
factorialof(num);
printf("Factorial is : ");
for(i=length;i>=0;i--){
printf("%d",fact[i]);
}
return 0;
}
void factorialof(int num){
int i;
for(i=2;i<=num;i++){
multiply(i);
}
}
void multiply(int num){
long i,r=0;
int arr[MAX];
for(i=0;i<=length;i++){
arr[i]=fact[i];
}
for(i=0;i<=length;i++){
fact[i] = (arr[i]*num + r)%10;
r = (arr[i]*num + r)/10;
//printf("%d ",r);
}
if(r!=0){
while(r!=0){
fact[i]=r%10;
r= r/10;
i++;
}
}
length = i-1;
}
私の質問は:
- MAX定数の本当の意味は何ですか?それが大きいか小さいかはどういう意味ですか?
- 私はMAX = 10000(この例のような)があれば、最大3250を計算できることを知りました! 3251と一緒に試してみたら!私は 'Abort trap:6'というメッセージを受け取る。なぜその番号ですか?それはどこから来たのですか?
- フラグ-m32を指定して32ビットマシン用にこのコードをコンパイルすると、どちらの違いがありますか? 64ビットと同じように動作しますか?
ありがとう!
ありがとう。だから、 "Abort trap"を避けるために、どちらが "良い実装"になるのだろうか。階乗を計算する前に、何桁の数字を受け取ることができるのですか?だから私にエラーを与える数字を処理するのを避けるために... –
最も簡単なアプローチは、あなたのすべての配列の書き込みがあるので、 'multiply'関数にいくつかの境界チェックを入れることです。関数の最初で、 'length> = MAX'なら問題あり、' while'ループの最上位で 'i> = MAX'なら問題あります。たとえば、関数が 'void'ではなく' bool'を返すようにして、計算が成功したかどうかを示すことで、問題を示すことができます。 –
他のオプションは、固定長配列ではなく、より多くの領域が必要になるほどデータ構造体を使用するか、値が高すぎる値を入力した場合にユーザーにすぐに通知する入力検証を記述することです。 (適切な制限を自分で計算し、それを別の定数として含めるか、またはn!の小数点以下桁数を返す関数f(n)を派生させなければならないでしょう) –