- 締切済み
ユークリッド互除法
ユークリッド互除法を使用して最大公約数を求めるプログラムを、C言語で書いてみました。 #include <stdio.h> main() { int a, b, t; scanf("%d %d", &a, &b); if(a<b){ t=a; a=b; b=t; } while(b != 0){ t = a % b; a = b; b = t; } printf("GCD = %d\n", a); return 0; } これを、もっと簡略化できるらしいのですが、これ以上できることはありますか? どう考えてもわかりません
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- D-Matsu
- ベストアンサー率45% (1080/2394)
b > aでループインした場合、初回はswapと等価の動作をするのでループ前にわざわざ入れ替える必要ナシ、ってことではないですか。 それよりa, bの自然数判定がないのが気にかかりますが。
- Tacosan
- ベストアンサー率23% (3656/15482)
もっとヒント: なんで a ≧ b じゃないと都合が悪いの?
- chie65536
- ベストアンサー率41% (2512/6032)
aがbより小さい場合に、aとbを入れ替える処理 t=a; a=b; b=t; の3行と、互除法のループの処理 t = a % b; a = b; b = t; を見比べてみよう。 違うのは、1行目が t=a; か t = a % b; かの違いしかない。2、3行目は同じだ。 って事は、1行目を工夫すれば、共通の処理に簡略化できそうだ。ループの中に大小比較が入るので、速度が落ちると言う欠点はあるが。 #include <stdio.h> main() { int a, b, t; scanf("%d %d", &a, &b); while(b){ t = (a < b) ? a : a % b; a = b; b = t; } printf("GCD = %d\n", a); return 0; }
- psychesine
- ベストアンサー率32% (17/52)
自分が他に見たソースと同じですよ。 if文が入る理由は、ユークリッド互除法の条件で a が b 以上である事が 条件だからでは?
- Tacosan
- ベストアンサー率23% (3656/15482)
if 文を入れた理由は?