• 締切済み

ユークリッド互除法

ユークリッド互除法を使用して最大公約数を求めるプログラムを、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; } これを、もっと簡略化できるらしいのですが、これ以上できることはありますか? どう考えてもわかりません

みんなの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

b > aでループインした場合、初回はswapと等価の動作をするのでループ前にわざわざ入れ替える必要ナシ、ってことではないですか。 それよりa, bの自然数判定がないのが気にかかりますが。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

もっとヒント: なんで a ≧ b じゃないと都合が悪いの?

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

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; }

回答No.2

自分が他に見たソースと同じですよ。 if文が入る理由は、ユークリッド互除法の条件で a が b 以上である事が 条件だからでは?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

if 文を入れた理由は?

関連するQ&A

  • ユークリッドの互除法

    ユークリッドの互除法をJavascriptで書こうとしてます。以下のように書いたのですが、うまく動きません。(45と60の最大公約数を求めるプログラム) <script> window.alert(gcd(45, 60)); function gcd(a, b){ var r=a%b; if(r==0){ return b; }else{ gcd(b, r); } } </script> undifinedとなってしまいます。どうしたら正確な答えが出るでしょうか?

  • ユークリッドの互除法

    ユークリッドの互除法がよくわかりません。 m>nとして(m=nならばm=gcd(m,n)) m=sn+t (n>t)とあらわせる。 ここでgcd(m,n)=gcd(n,t)となるのがわかりません。 これがわかったらあとはあまり部分が0になるまでやればそのときに最大公約数が出るというのはわかるのですが、、、

  • 再帰関数とユークリッドの互除法を用いて最大公約数を求める

    学校の課題で、再帰関数とユークリッドの互除法を用いて10~100000までの最大公約数を求めるという問題が出て自分でプログラムを作ってみたのですが無限ループに入ったり、関数が使えてないみたいでできません。プログラムを見て頂いて、どこを改善したらいいかを教えてください。 #include <stdio.h> /* 正整数 n, m の最大公約数を計算する */ int gcd(int n, int m) { int res; res = n % m; if (res == 0) return m; /* 最大公約数が求まった */ return gcd(m, res); /* 再帰呼び出し */ } int main(void) { int i,j; for(i=10000;i>=10;i--){ for(j=10;j=10000;j++){ printf("%d to %d no saidaikouyakusuu ha %d \n", i, j, gcd(i, j)); } } return (0); } です。期限が今日の夜までで、ぎりぎりなんですがよろしくお願いします。

  • ユークリッドの互除法

    ユークリッドの互除法の処方でつまづいています。 どなたか教えて頂けませんか。 aとbは正の整数でb≦aの関係にある。 aとbの最大公約数gcd(a,b)。 この時gcd(a,b)=ax+byの解となる(x,y)のペアはいくついるのでしょうか? 直感ですと(x,y)は一つしか存在しないように感じるのですが、どうやって記述すればいいのでしょうか? よろしくお願いします。

  • ユークリッドの互除法

    二つの整数a,bの最大公約数dを、ユークリッドの互除法で求める方法は分かります。 そうして求めたdは、適当な数x,yを使い、d=ax+byで表せることも何とか分かります。 しかし、d=ax+byが与えられたとき、ユークリッドの互除法を使って、特殊解xとyをどうやって求めたらよいのかが分かりません。 これまでの書き込みを見ても理解ができませんでした。 どなたか分かりやすくお教えください。

  • わかりません・・・。

    二つの自然数を引数として与えられて,それらの最大公約数を返す関数 int gcd(int m, int n) { /* … */ }を作成し,それを利用して入力された二つの正整数の最大公約数を求めるプログラムを作り方を教えてください。 ユークリッドの互除法を使い、関数を使う事が条件なのですが全然わかりません。 #include<stdio.h> int gcd(int m, int n) if(m>n) {m%n}            if(m%n==0) printf("最大公約数は%d",n); ←このあたりがわかりません else if (n%(m%n)) printf("最大公約数は%d",n%(m%n)); int main( void ) { int na, nb; puts(""二つの整数を入力してください。); printf("整数1:"); scanf("%d",na); printf("整数2:"); scanf("%d",nb); printf("最大公約数は%dです。\n",gcd(int m, int n)); return0; }

  • ユークリッドの互除法

    ユークリッドの互除法の証明の一部なのですが aをで割った商をbあまりをrとすると a=bq+r であるので r=a-bq である。ここで、この右辺はa bの最大公約数でわり切れるのは、なぜか教えて下さい。あと a bの最大公約数がrとb の公約数でもあるのはなぜですか?お願いします。

  • このプログラム見てほしいです!!

    #include <stdio.h> int gcd2(int a, int b) { if (!b) return a; return gcd2(b, a%b); } int main() { int a, b, c; printf("2つの任意の整数を入力せよ:"); scanf("%d %d",&a,&b); c=gcd2(a,b); printf("最小公倍数は%d\n",a*b/c); printf("最大公約数は%d\n",c); return 0; } で、最小公約数を出すことはできたのですが、全ての公約数を表示させたいんです!!どうやったらいいのでしょうか??プログラミングまだ初心者なので、ちょっと行き詰ってしまいました。。。 お時間があればでいいのですが、もう一つわからないプログラムがあります。 自然数nを入力し、x^2+y^2=z^2 (x<y)を満たすようなn以下の自然数の組(x,y,z)がいくつあるのかを出力するプログラムなのですが、全くわからず行き詰っています。。どなたかお時間があれば教えて頂きたいです。 色々と申し訳ありません。お願いします(__)

  • ユークリッドの互除法について

    質問させて頂きます。   (有理整数環Zにωを添付した整域Z[ω]をRとする。R=Z[ω]={a+bω}において) ω=(-1+√3i)/2 とした場合、α=16+14ω、β=11+9ω の最大公約元、最小公倍元の求め方をユークリッド互除法にて教えて下さい。 よろしくお願いいたします。

  • Cで書かれたユークリッド互除法プログラムをJavaに

    a と b とを与えて d=GCD(a,b) と ax+by=d の解 x,y を与えるプログラム: #include<stdio.h> void f(int a,int b,int*d,int*x,int*y) { int x1,y1; if(b==0) {*x=(a>=0?1:-1); *y=0; *d=abs(a);} else { f(b,a%b,d,&x1,&y1); *x=y1; *y=x1-(a/b)*y1; } return;} int main(int argc, char**argv) { int a,b,d,x,y; if(argc!=3) exit(0); f(a=atoi(argv[1]), b=atoi(argv[2]), &d, &x, &y); printf("\n %d * %d + %d * %d = %d \n\n", a,x,b,y,d); } 上記のCプログラムをJavaに書き換えたいのですが、まったくといっていいほど手も足も出ません。 Javaはまだ初心者なもので… どなたか詳しい方、どうかアドバイス、またはご教授お願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう