在运行此代码时,我得到浮点异常请解释为什么会这样。
#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);
}
}
答案 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==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
修改了d
的倍数,m
也是d
的倍数,因为n * (m div n)
}和m mod n / d
。
另一方面,如果m
和n
是e
的倍数,则因为m mod n = m -n * (m div n)
也是e
的倍数。