最大公約数(GCD),最小公倍数(LCM)を求めるプログラムを作成しようとしています。
最終的な最大公約数が求まるまでの途中過程を表示をしたいのですが、実行すると途中経過がうまく表示されていないようです。
改善点をおしえてください。
#include <stdio.h>
int gcd(int,int);
int main()
{
int m,n,g,l;
printf("m,nの最大公数約,最小公倍数を求めます\n");
printf("mとnを整数で入力してください。\n");
printf("m=");
scanf("%d",&m);
printf("n=");
scanf("%d",&n);
if(m<=0||n<=0)
printf("再入力してください。\n");
g=gcd(m,n);
l=(m*n)/gcd(m,n);
printf("GCD=%d\n",g);
printf("LCM=%d\n",l);
}
int gcd(int x,int y)
{
int r;
while (x>0&&y>0)
{
r=x%y;
x=y;
y=r;
printf("(m,n)=(%d,%d)\n",x,y);
}
return x;
}
最小公倍数・最小公約数についておしえてください。
Re: 最小公倍数・最小公約数についておしえてください。
うまく表示されていないとは、「どうなって欲しい」が、「今どうなっている」を説明しないと何とも言ってみようがありません。kimi さんが書きました:最終的な最大公約数が求まるまでの途中過程を表示をしたいのですが、実行すると途中経過がうまく表示されていないようです。
m=24, n=20として実行してみたところ、
(m,n)=(20,4)
(m,n)=(4,0)
と表示されますが、引数として渡した
(m,n)=(24,20)
が表示されないことが問題なのでしょうか?
それでしたら、while文に入る前に表示処理を入れる必要があります。
1.gcd関数は x > y である必要がありますが、チェックされていません。kimi さんが書きました:改善点をおしえてください。
2.lcmを求めるのに既に求めたgcdの結果を使用せずに、もう一度gcdを呼び出しています。無駄です。g が使用できます。
3.lcmを求める途中で m*n がオーバーフローする可能性があります。
m / g * n とする方がオーバーフローする可能性が小さくなります(結果的にオーバーフローするのは救いようがない)。
Re: 最小公倍数・最小公約数についておしえてください。
>1.gcd関数は x > y である必要がありますが、チェックされていません。
試してみればわかりますが、x < y でも while の最初の一回で x と y が入れ替わるので
問題ありません。
試してみればわかりますが、x < y でも while の最初の一回で x と y が入れ替わるので
問題ありません。
Re: 最小公倍数・最小公約数についておしえてください。
あれ、剰余演算子は除数の方が大きくてもいいんですね。いわれてみればそうですね。フリオ さんが書きました:>1.gcd関数は x > y である必要がありますが、チェックされていません。
試してみればわかりますが、x < y でも while の最初の一回で x と y が入れ替わるので
問題ありません。