我正在读“C编程现代方法”一书。我有一个练习,我应该将分数降低到最低形式。
作者给我的提示,是我首先可以计算分子和分母的GCD,然后用GCD除以分子和分母。
这是我的计划:
#include <stdio.h>
int main(void)
{
int frac1;
int frac2;
int gcd;
int a;
int b;
int c;
printf("Enter a fraction: ");
scanf("%d/%d", &frac1, &frac2);
b = frac1;
a = frac2;
//Calculate GCD
c = a % b;
while(gcd > 0)
{
a = b;
b = c;
c = a % b;
if(c <= 0)
{
gcd = b;
break;
}
}
//Divide the numerator and denominator with the GCD
frac1 /= gcd;
frac2 /= gcd;
printf("In lowest terms %d/%d\n", frac1, frac2);
return 0;
}
当我输入6/12作为输入时,我收到以下错误消息:浮点异常
如何分别计算分子和分母的GCD?
答案 0 :(得分:4)
在您的代码中,您永远不会初始化gcd
,并且循环有点奇怪。什么时候gcd突然变为零,所以它会退出?我想你的意思是
a = frac1;
b = frac2;
//Calculate GCD
c = a % b;
while(c > 0)
{
a = b;
b = c;
c = a % b;
}
gcd = b;
因此,当您输入6/12时,它将获得c = 6
,进入循环,将其切换为6/6,获取c = 0
,退出并将gcd设置为b,即6。
答案 1 :(得分:0)
输入6/12
时
c = a % b;
生成c = 0
,然后
a = b;
b = c;
c = a % b;
a % b
除以0。
您必须检查scanf()
是否扫描了两个值而不是假设,示例
if (scanf("%d/%d", &frac1, &frac2) != 2)
{
fprintf(stderr, "Wrong input!\n");
return -1;
}
您永远不会初始化gcd
,因此while (gcd > 0)
导致未定义,因为您在循环开始之前不知道gcd
的值。