繁体   English   中英

C程序中的浮点异常

[英]floating point exception in c program

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

#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);
    }
 }

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) 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 mod n是d的倍数,则m也是d倍数,因为n * (m div n)m mod n / d

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM