我正在编写一个程序来将分数减少到最低项。这是我的程序:
#include <stdio.h>
int main(){
int m,x,n,gcd;
printf("Enter a fraction: ");
scanf("%d/%d",&n,&m);
if(m==0)printf("Error");
else
for(;;){
x=m%n;
if(x==0){
gcd=n;
m/=gcd;
n/=gcd;
printf("In lowest terms: %d/%d",n,m);
}else
m=n;
n=x;
}
return 0;
}
我使用 Euclid 算法计算 GCD。执行时,它报告
Floating point exception (core dumped)
我的代码有什么问题?
最佳答案
您已成为此处阻塞作用域的牺牲品:
if(x==0){
// ...
}else
m=n;
n=x;
这将被执行为:
if(x==0){
// ...
}else{
m=n;
}
n=x;
这意味着当 x
为零时,n
在循环结束时被设置为零。当你再次转过来计算m % n
时,你遇到了问题。或者,如果出于某种原因给出一个值而不会导致程序崩溃,那么 gcd = n
将在您随后除以 m 时最终给您被零除
和 n
通过 gcd
。
如果您希望多个语句成为else
分支的一部分,那么您需要将它们括在大括号中,如下所示:
if(x==0){
// ...
}else{
m=n;
n=x;
}
事实上,始终使用大括号是一种很好的做法,即使只有一个语句也是如此。在我的工作场所,这甚至包含在我们的编码标准中,并且是代码审查过程的一部分。
关于c - 计算GCD时出现 float 异常(core dumped),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32516308/