質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

155閲覧

ユーグリッドの互除法を求める二つの関数の違い

ryu72639

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/06/30 09:49

編集2018/06/30 09:51

下の二つの関数の違いを教えて下さい。上の方は数字が大きくなると正しい答えが出ません

c

1#include <stdio.h> 2int yugurid(int number1, int number2) /*ユーグリッドの互除法による最大公約数*/ 3{ 4 int r, a, b; 5 6 if (number1 < number2){ 7 a = number1; 8 b = number2; 9 } 10 else { 11 a = number2; 12 b = number1; 13 } 14 15 r = b % a; 16 17 while (r != 0) 18 { 19 a = b; 20 b = r; 21 r = b % a; 22 } 23 return a; /* a = 最大公約数 */ 24}

c

1#include <stdio.h> 2 3int yugurid(int x, int y) 4{ 5 if(x % y == 0) 6 return y; 7 return yugurid(y, x % y); 8}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HogeAnimalLover

2018/06/30 10:39

具体的に正しい結果が出ないときの、状況(number1,number2の値)は何ですか?
guest

回答3

0

ループ内で、aとbの更新が変です。bにaを、aにはrを代入します。

投稿2018/06/30 13:06

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

bを大きい数、aを小さい数とするなら、値の交換は

b = a; a = r; r = b % a;

とすべきなのでは?

投稿2018/06/30 13:00

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

言語タグはC#じゃなくてCですよね?

C#で動かしてみて、関数1ではaとbとrを、
関数2ではxとyとx % yを標準出力で確認してみました

yugurid1(123, 127)
a=123, b=127, r=4
a=127, b=4, r=4
a=4, b=4, r=0
結果=4
yugurid2(123, 127)
x=123, y=127, x % y=123
x=127, y=123, x % y=4
x=123, y=4, x % y=3
x=4, y=3, x % y=1
x=3, y=1, x % y=0
結果=1

ループ内でaとbに代入する際に大小関係を間違えていませんか?
こちらで間違いを直せば関数2と同じ結果になりましたので

投稿2018/06/30 11:51

len_souko

総合スコア1348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryu72639

2018/06/30 12:15

最初に if (number1 < number2){ a = number1; b = number2; } else { a = number2; b = number1; } として、大%小としているのですが、それだとダメなのですか?
len_souko

2018/06/30 13:07

whileの中の話をしています aに大きい方の値を代入して、bに余りを代入していますよね? 次のループでは小さい方の数値が消えてaに前回の余りを代入し、bに今の余りを代入していますよね 2巡目で元の数値は完全に消えてしまいました いったい何の計算をしようとしているのでしょうか?
len_souko

2018/06/30 13:09

開発環境が分からないのでやり方は何とも言えませんが、おかしいと思ったのなら変数の値の変化を確認するようにしましょう
len_souko

2018/06/30 13:20

ループ前:a=数値(小)、b=数値(大),r=数値(大)÷数値(小)の余り//以降は余り(1)  1回目:a=数値(大)、b=余り(1),r=余り(1)÷数値(大)の余り//当然 数値(大)>余り(1)なので余り(1)と同じ値  2回目:a=余り(1)、b=余り(1),r=余り(1)÷余り(1)の余り//同じ数値で割るためあまり0
len_souko

2018/06/30 13:23 編集

なお、理解せずともコピペできる回答ではなく、なぜなのかを考えてわかってもらえるようにと回答しています
ryu72639

2018/07/01 08:48

なるほど、確かにそうですね。わかりやすい回答ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問