• 締切済み

アルゴリズムと問題解決に関する問題

二つの正の整数A,Bの最大公約数を求めるユークリッドの互除法のアルゴリズム 互除法(A,B) 入力正の整数A,B 1 もしA<Bならば 2 BをAで割ったあまりをCとせよ 3 もしC=0でないならAを出力して終了 4 そうでないならば 5 GCD=互除法(A,C)とし、GCDを出力し終了 6 そうでないならば 7 AをBで割ったあまりをCとせよ 8 もしC=0ならばBを出力して終了 9 そうでないならば 10 GCD=互除法(B,C)とし、GCDを出力し終了 互除法(48,84)を行ったときのうえのアルゴリズムの動作(再帰呼び出しの途中に現れるCやGCDの値)を求めよ これを一応といてみましたが表現方法がいまいちわからないので良い回答の仕方教えてください。 自分で解いた答え 1 A<BなのでB/Aのあまり36をCとする 2 C=36 3 Cは0でない 4、5 GCD=(A,C)=(48,36) 1に戻る A=48,B=36とする 1 A<Bでない 6 A/BのあまりをCとする 7 48/36のあまり C=12 8 Cは0でない 9,10 GCD=(36,12) 1に戻る A=36,B=12 1 A<Bでない 6,7 36/12 C=0 8 C=0 B=12

みんなの回答

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

トレースはきちんと出来ていますね。 ただ問題の出来がひどすぎます。 1.項番5と項番10のGCDの出力は絶対に通らないようになっています。 GCDには値も入りません。 必ず項番3と項番8でしか出力しません。 問題を出した人が再帰が良くわかっていないようです。 これをきちんとするには「RETURN:CALL先の次へ戻る」を入れる必要があります。 それをしないとこのプログラムはおそらく暴走するでしょう。 2.項番3は「もしC=0なら」のミスでしょう。 一応このままやってみると 1 48:84だからA<B 2 C=84%48=36 3 C≠0で次へ 4,5 48,36で互除法を呼ぶ  1 48:36だからA<Bではない 6,7 C=48%36=12 8 C≠0で次へ 9,10 36,12で互除法を呼ぶ 1 36:12だからA<Bではない 6,7 C=36%12=0 8 C=0なのでb=12を出力して終了 てなとこでしょうか。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

再起処理をしない例です。 1. もし、B>0ならばループ、それ以外はループから脱出し、6に行く 2. cにa÷bの余りを代入する。 3. aにbを代入する。 4. bにcを代入する。 5. 1に行く 6. aが最大公約数 いかがでしょうか。 JavaScriptであれば、 function gcm(a,b) {   var c ;   while ( b > 0 ){     c = a%b ;     a = b ;     b = c ;   }   return a ; } C言語であれば、 int gcm(int a,int b) {   int c ;   while ( b > 0 ){     c = a%b ;     a = b ;     b = c ;   }   return a ; }

関連するQ&A

  • マイクロコンピューター制御の問題です

    「CASL2のプログラムを作成せよ」とのことで、次の問題が出されました。 問1.GR1の中身の値(正の整数)とGR2の中身の値(正の整数)の最大公約数をGR3 に入れて返すようなサブルーチンGCDを作れ。再帰を利用すること。   (ヒント)   最大公約数を求めるには、ユークリッドの互除法というアルゴリズムがある。C 言語で記述すると、再帰を使って以下のように書ける。  int gcd (int x,int y){ if (y==0)return x; return gcd(y,x%y); } 問2.IN命令により入力された10進数の数値を、16進数に変換して、OUT命令により 表示するプログラムをかけ。 以上の二つです。 手前勝手な事情ですが、明日8/9の午後4時までに、解答の方をよろしくお願いします。

  • ユークリッドの互除法

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

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

     ユークリッドの互除法を使って最大公約数、整数解を求められると聞いたのですが、イマイチ要領がつかめません。    もしよろしければ、どなたかユークリッドの互除法での最大公約数、整数解の求め方を教えてください。

  • プログラミングの問題です。

    プログラミングの問題です。 二つの自然数の最大公約数(つまり二つの整数を割りる最大の数)を 求める「ユークリッドの互除法」のアルゴリズムを 箇条書きで表現せよ。ただし、PADおよびプログラミングに書き直せるように 適当な変数を用いること。と言われました。 私はどうしていいかわかりません。どなたか解答してくれませんか。 よろしくお願いします。アドバイスとか何でもいいのでよろしくお願いします。

  • 整数問題

    二つの奇数a,b にたいして,m = 11a + b,n = 3a + b とおく.つぎのことを証明せよ. m,n の最大公約数は,a,b の最大公約数をd として,2d,4d,8d のいずれかである. 僕はユークリッドの互除法を考えました。 (11a+b)=(3a+b)*1+8a よってmnの最大公約数は3a+bと8aの最大公約数である。 さらに(3a+b)=(3/8)*8a+b として8aとbの最大公約数が求める最大公約数と考えましたが、ここで矛盾が生じます。 bは奇数であるので偶数の2d等を因数に持たない。 よく考え直してみたのですが、ユークリッドは商が整数にならなければならないのでしょうか?2回目にユークリッドを使うときに商が3/8となってるのがまずいのでしょうか? またこの問題はどう解いたらよいでしょうか?教えてください。

  • 2^91-1と2^65-1の最大公約数

    2^91-1と2^65-1の最大公約数を求めるにはどうすればいいのですか? これほど大きな値だと共通の素数で割ることもユークリッドの互除法も使えそうにありません。 ちなみにコンピュータに解いてもらったら GCD(2^91-1,2^65-1)=8191 でした。

  • ユークリッドの互除法

    ユークリッドの互除法を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となってしまいます。どうしたら正確な答えが出るでしょうか?

  • 最大公約数の問題

    公約数と公倍数、という単元の問題なのですが 問2-3が「次の最大公約数を求めよ」というもので (39,18,8) などの問題が出されており、それに続く問題として 問2-4 自然数 a,b,c に対して ((a,b),c)=(a,(b,c)) が成り立つことを示せ。 というものがあります。 最大公約数を使って解く問題だとは予想できるのですが、どのようにすれば証明できるのかが分かりません。 その前の問題では、ユークリッドの互除法を用いて最大公約数を求めていました。 どなたか分かる方がいらっしゃいましたら、ご教授願います。

  • ユークリッドの互除法

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

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

    学校の課題で、再帰関数とユークリッドの互除法を用いて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); } です。期限が今日の夜までで、ぎりぎりなんですがよろしくお願いします。

専門家に質問してみよう