2017-11-09 2 views
-2

私はこのプログラムを書いています。しかし、算術例外エラーが発生しています。 プログラム:工芸的例外エラーを取得する

#include<bits/stdc++.h> 
using namespace std; 
int fact(int n) 
{ 
    int facte = 1; 
    for (int i = 1; i <= n; i++) 
     facte *= i; 
    return facte; 
} 
int main() 
{ 
    int n, k; 
    cin >> n >> k; 
    int sum1 = 0; 
    int res = 0; 
    int temp = k; 
    int term1, term2, term3; 
    while ((n - temp) > 1) 
    { 
     term1 = fact(n); 
     term2 = fact(n - temp); 
     term3 = fact(temp); 
     res = int((term1/(term2 * term3))); 
     sum1 += res; 
     temp--; 
    } 

    cout << sum1 * fact(n - k - 1) + 1; 
} 

入力:

n=4 and k=2
エラー:
 GDB trace: 
    Reading symbols from solution...done. 
    [New LWP 18123] 
    Core was generated by `solution'. 
    Program terminated with signal SIGFPE, Arithmetic exception. 
    #0 main() at solution.cc:29 
    29  res=int((term1/(term2*term3))); 
    #0 main() at solution.cc:29

+0

「term2」または「term3」はゼロでなければなりません。 – dasblinkenlight

+0

'p term2'と' p term3'はどのような値を持っているのかを調べるには – pm100

+0

'sum + = res;の代わりに' sum1 + = res; 'を使うべきだと思います –

答えて

0

2つの階乗数を掛けるとintをオーバーフローすることができます。

も変化

res = (term1/term2)/term3; 

//追加カッコ

res = int((term1/(term2 * term3))); 

は、念のために交換してください

temp--; 

temp++; 
+1

それは、階乗自体がオーバーフローしなかったと仮定しています。 – user4581301

+0

右。しかし、もしそうすれば、早期に例外が発生するだろう。そのような場合は、long intまたは他の適切なタイプを使用してください。 – Victor

+0

それは仕事をしませんでした。同じエラーを得る –

関連する問題