[英]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==0
并return
变量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 = m
且m mod 1 =0
。
如果n
和m
mod n是d
的倍数,则m
也是d
倍数,因为n * (m div n)
和m mod n / d
。
另一方面,如果m
和n
是e
倍数,则因为m mod n = m -n * (m div n)
也是e
倍数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.