3

有理数を単純化するための構造体を使用して関数を作成したかったのですが、
1 つのメンバーは分子 (int) で、もう 1 つは分母 (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);
}
4

2 に答える 2

4
于 2014-01-15T17:37:51.300 に答える
1

問題は、8 20 を入力すると、数字が次のように変化することです。

4 10

2 5

1 2

0 1

0 0 <--- これが無限ループです

理由は、整数は数値を切り捨てるため、数値が 0 に達した場合の制御ステートメントを追加する必要があるためです。

于 2014-01-15T17:37:29.440 に答える