我想用结构来创建一个简化有理数的函数,一个成员是分子(int),另一个是分母(int),但程序停留在输入! 我知道scanf()有点危险,但我认为它只是几个整数!
#include <stdio.h>
#include <stdlib.h>
typedef struct rational{
int num;
int den;
}rational;
rational makerational(int num,int den);
void printrational(rational r);
int main()
{
int a,b;
printf("\n\n Input integers for fraction:");
scanf(" %d%d",&a,&b);
printrational(makerational(a,b));
}
rational makerational(int a,int b){
int live=1;
rational r;
r.num=a;
r.den=b;
while(live){
if(!(r.num%2 && r.den%2)){
r.num/=2;
r.den/=2;
}else if(!(r.num%3 && r.den%3)){
r.num/=3;
r.den/=3;
}else if(!(r.num%5 && r.den%5)){
r.num/=5;
r.den/=5;
}else if(!(r.num%7 && r.den%7)){
r.num/=7;
r.den/=7;
}else live--;
}
return r;
}
void printrational(rational r){
printf("\nFRACTION -> %d/%d\n",r.num,r.den);
}
答案 0 :(得分:4)
你陷入无限循环:
while(live){
if(!(r.num%2 && r.den%2)){
r.num/=2;
r.den/=2;
}
…
}
例如,当r.num == 1
和r.den == 2
时,请考虑发生了什么:
迭代1
r.num % 2 == 1 % 2 == 1
r.den % 2 == 2 % 2 == 0
!(1 && 0) == 1
r.num / 2 == 1 / 2 == 0
r.den / 2 == 2 / 2 == 1
迭代2
r.num % 2 == 0 % 2 == 0
r.den % 2 == 1 % 2 == 1
!(0 && 1) == 1
r.num / 2 == 0 / 2 == 0
r.den / 2 == 1 / 2 == 0
迭代3到无限及超越......
r.num % 2 == 0 % 2 == 0
r.den % 2 == 0 % 2 == 0
!(0 && 0) == 1
r.num / 2 == 0 / 2 == 0
r.den / 2 == 0 / 2 == 0
将分支语句中的表达式更改为类似的内容以更正逻辑:
while(live)
{
if((r.num % 2 == 0) && (r.den % 2 == 0))
{
r.num /= 2;
r.den /= 2;
}
…
}
答案 1 :(得分:1)
问题是,当你输入8 20时,数字会像休息一样改变;
4 10
2 5
1 2
0 1
0 0&lt; ---这里是无限循环
原因是,整数向下舍入数字,你应该为数字达到0的情况添加一个控制语句