c程序中的浮点异常

时间:2014-11-11 22:11:11

标签: c exception floating-point

在运行此代码时,我得到浮点异常请解释为什么会这样。

#include <stdio.h>
int gcd(long int, int);
int main() {
    int t, n, a, i;
    long int abc;
    scanf("%d", &t);
    while (t--) {
        abc = 1;
        scanf("%d", &n);
        abc = n * (n - 1);
        for (i = n - 2; i > 1; i--) {
            a = gcd(abc, i);
            abc = ((abc * i) / a);
        }
        printf("%ld \n", abc);
    }
    return 0;
}
int gcd(long int a, int b) {
    if (b == 0)
        return a;
    else {
        return (b, a % b);
    }
 }

2 个答案:

答案 0 :(得分:4)

gcd函数中的else部分是假的。您可能希望以递归方式调用gcd,而是返回a % b。结果如果a % b == 0在第13行除以0.

表达式(b, a % b)被评估为由逗号运算符分隔的两个子表达式。忘记了b的值,整个表达式的值变为a % b

正确的版本:

int gcd(long int a, int b) {
    if (b == 0)
        return a; 
    else {
        return gcd(b, a % b);
    }
 }

答案 1 :(得分:0)

你应该改变一些事情:

1)if(a == 0)代替b==0return变量b
2)使用递归gcd(b%a, a)

if (a == 0)
       return b;
    else {
        return gcd(b%a, a);
    }

你也可以使用这个简短的版本

return  a ? gcd(b%a,a) : b;

证明:

我们有m = n * (m div n) + m Mod n

此等式甚至是if n = 1正确,因为m div 1 = mm mod 1 =0

如果nm修改了d的倍数,m也是d的倍数,因为n * (m div n) }和m mod n / d

另一方面,如果mne的倍数,则因为m mod n = m -n * (m div n)也是e的倍数。