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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1945閲覧

ユークリッドの互除法を使ったコードを理解したいです。

talabagani

総合スコア50

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/06/25 23:48

編集2021/06/26 13:40

#[環境]
Java version 16.0.1
VS Code
Mac OS Big Surの環境です。
java -version
java version "16.0.1" 2021-04-20
Java(TM) SE Runtime Environment (build 16.0.1+9-24)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)
Tomis-MacBook:09_MinutesToYearsandDayCalculator $

#[やりたいこと]
ユークリッドの互除法を使った最大公約数を求めるコードを理解したいです。

二つの整数の最大公約数を求める演習をやっていてコードを書きました。
問題なくできたのですが、模範回答はユークリッドの互除法というアルゴリズムを使っているそうです。wikipediaでユークリッドの互除法をよみ、ユークリッドの互除法自体は理解したのですが、模範回答にあるコードが理解できません。
youtubeでユークリッドについてわかりやすく説明してくれている動画を見ました。https://youtu.be/246Yxl8gTVk

コードの流れをご教授いただけないでしょうか?
#[演習問題概要]
getGreatestCommonDivisorという最大公約数を求めるメソッドを書きましょう。
これは2つの引数があります。そしてタイプはintで名前はfirst とsecondです。
どちらかが10より小さい場合は -1が出るようにしてください。それが引数が適切ではないという印です。

#[エラー]
エラーではないので、エラーメッセージはありません。
#[学習状況]
progateを3巡、ドットインストール1巡、スッキリJavaの本を8割読みました。
現在、UdemyのJava Programming Masterclass for Software Developersというコースで演習問題に取り組んでいます。Java学習を初めて一ヶ月目が過ぎたところです。
ドットインストール、Udemyの演習はVScodeに書いてそのターミナルにコマンドを書いています。
この問題はUdemyでの演習19番目なので、まったくの初めてというわけではありません。
まだまだ初心者ですが真面目に取り組んでいるので、何卒、よろしくお願いします。

#[コード]

java

1public class GreatestCommonDivisor { 2 3 public static int getGreatestCommonDivisor(int first, int second) { 4 5 if (first < 10 || second < 10) { 6 return -1; 7 } 8 while (first != second) { 9 if (first > second) 10 first = first - second; 11 else { 12 second = second - first; 13 } 14 } 15 return second; 16 } 17}

#ちなみに、私のユークリッドを使わないコードは以下です。

java

1public class GreatCommonDivisor{ 2 public static int getGreatCommonDivisor(int n1, int n2){ 3 if(n1<10 || n2 <10){ 4 return -1; 5 } 6 7 int divisor=1; 8 for(int i=1 ; i<=n1; i++){ 9 if(n1%i==0 && n2%i==0){ 10 divisor = i; 11 } 12 } 13 return divisor; 14 } 15}

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

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

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

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

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

gentaro

2021/06/26 00:01 編集

「コードの流れ」の何がわからないのか具体的に書こう。 少なくともデバッグ実行すれば各ステップにおける値の遷移を含めてすべて「流れ」は追えるはずなので、疑問点が伝わらない。
gentaro

2021/06/26 00:15

https://teratail.com/help/question-tips#questionTips2 「2. 質問をする前に自分で何がわからないのかを把握しましょう」 https://teratail.com/help/question-tips#questionTips3-5-2 「何ができていて、何ができていないのか(何がわかっていて、何がわからないのか)を書きましょう」 少なくとも > wikipediaでユークリッドの互除法をよみ、ユークリッドの互除法自体は理解した 上での質問であれば、その理解とコードに何らかの乖離があるのが疑問の出発点になっているはずです。 あなたがどのように理解しており、コードのどの部分で理解ができなかったのか説明する必要があります。
swordone

2021/06/26 01:42

ところで、最初のifは何やってるんですか?
talabagani

2021/06/26 13:33

質問の仕方、確かに足りなかったなと思います。分かるのはどこままででどこからわからないか明記するようにします。
talabagani

2021/06/26 13:35 編集

最初のifについてですが、この演習問題の前提として整数10以上の数で考えることになっていて、9以下は対象外となっています。そこもきちんと書くべきでした。
guest

回答2

0

互除法は、2つの数の除算(割り算)を繰り返して最大公約数を求める方法です。
2つの数である被除数と除数は、除算の結果、除数と剰余に置き換えます。

模範解答のコードは、その割り算を、引き算を繰り返すことによって
余りが 0 になる状態にするという非効率なやり方で実現しています。

投稿2021/06/26 00:19

編集2021/06/26 00:22
kazuma-s

総合スコア8224

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

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

talabagani

2021/06/26 13:57

割り算を引き算でやっているんですね。なるほど、、、 ありがとうございました。
guest

0

ベストアンサー

互除法は、普通はfirst > secondであるとき(<なら両者を入れ替える)、
firstsecondで割り切れればsecondが最大公約数
・割り切れなければ、「secondfirst % secondの最大公約数」を求めてそれが答え
という計算をしますが、

割り算を引き算で実現すると、
「X を Y で割り、商と剰余を求める」というのは、
「X から Y を Y より小さくなるまで繰り返し引く。引いた回数が商で、最後に引いた差が剰余」
と言うことでもありますので、上記を%演算でなく引き算で実現すると、質問のコードになります。

投稿2021/06/26 00:33

otn

総合スコア85901

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

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

talabagani

2021/06/26 13:56

割り算を引き算で実現するという表現がすごくわかりやすかったです。ありがとうございました。 最終的にX=Yになるといるのが割り切れるということなんですね。 (722、171)→(38 171)→(38 19)→(19 19) すごいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問