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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

3271閲覧

最大公約数を再帰呼び出しを用いて表示したい

h_proc

総合スコア68

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/11/28 10:15

2数の整数の最大公約数を再帰呼び出しを用いて表示する関数を作りたいです、このようなプログラムを書いたのですが、2数を入力した段階で操作が停止してしまいます。どこが間違っているのでしょうか。

c

1#include <stdio.h> 2int Max(int u, int v); 3int Max(int u, int v) 4{ 5 int q, r = 0; 6 if (u > v) { 7 q = u / v; 8 r = u % v; 9 } 10 else { 11 q = v / u; 12 r = v % u; 13 } 14 15 if (r = 0) { 16 return printf("%d\n", v); 17 } 18 else { 19 int a, b = 0; 20 a = v; 21 b = r; 22 return Max(a, b); 23 } 24} 25int main(void) 26{ 27 int U, V, M = 0; 28 printf("Calculate GCM of two integers.\n"); 29 printf("Please input two integers.\n"); 30 scanf("%d", &U); 31 scanf("%d", &V); 32 M = Max(U, V); 33 printf("GCM = %d\n", M); 34 35 return 0; 36}

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

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

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

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

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

guest

回答3

0

ベストアンサー

if (r = 0) {
return printf("%d\n", v);
}

if (r == 0) {
return printf("%d\n", v);
}
にしてください。(r == 0)です。(r = 0)ではありません。
この間違いは、誰もが一度は通る道です。
これに懲りて、2度としないように自戒してください。(私も何度かやっています)

投稿2018/11/28 11:30

編集2018/11/28 11:37
tatsu99

総合スコア5424

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

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

yukkuri

2018/11/28 11:40

些細なことですが、回答ではMarkdownが使えるので、コードを囲ったほうがいいかと。
tatsu99

2018/11/28 11:47

ああ、そうですね。ソースの一部でしたので、そこまでは不要かと思い、Markdownしませんでした。次回から気をつけます。
yukkuri

2018/11/28 11:49

いや、些細なこと なので、この程度ならいい気もしますけどね。どこまでやるか、難しいですよね。
h_proc

2018/11/28 12:21

回答ありがとうございます。以後気をつけます。
rubato6809

2018/11/28 13:29

その return printf("%d\n", v); はバグです。これだとMax()関数が返す値は printf() の返す値だ、ということになる。printf() は表示した文字数を返すので、全く意味の異なる値がMax() の値になってしまいます。 printf() の表示は main() 関数で行うのであるから、ここでは printf() せず if (r == 0) { return v; } とすべきです。
rubato6809

2018/11/28 13:35

他にもバグがありそうですね。いろいろテストしてみてください。
guest

0

ずっと再帰が続いてる状態ですね。

再帰関数内で**再帰をするreturn再帰を終えるreturn**がありますが、
再帰を終えるreturnに処理が届いていないことが原因です。

とりあえず、そのreturnに入るif文に注目しましょう。

投稿2018/11/28 10:25

dice142

総合スコア5158

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

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

0

まず

C

1int Max(int u, int v); 2int Max(int u, int v){}

と定義のすぐ下に実装を書くのは意味がありません。

int Max( int u, int v ){}

で十分です。
最大公約数は、

int gcd(int u, int v) { if(u < v) return gcd(v, u); if(v == 0) return u; return gcd(v, u % v); }

程度でかけるので言い方がひどいですが長々と書く必要はないかと。
最後に、最大公約数はGCDでは?

追記
分けて書く例はこんな感じです。

C

1int Max( int u, int v ); // main関数で使うが中身を上に書かないため定義だけしておく 2 3int main( void ) 4{ 5 Max( 3, 4 ); // こうするとエラーは起きない 6} 7 8int Max( int u, int v ) // ここで実装 9{ 10// 実装内容とreturn 11}

投稿2018/11/28 10:31

編集2018/11/28 11:00
yukkuri

総合スコア624

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

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

cateye

2018/11/28 10:53 編集

>定義のすぐ下に実装を書くのは意味がありません。 clangでは、プロトタイプを省略すると、 //void binary(int x, char *str, int siz); void binary(int x, char *str, int siz) { 略 } で、-Weverythingのコンパイルオプションをつけると ct0.c:8:6: warning: no previous prototype for function 'binary' [-Wmissing-prototypes] void binary(int x, char *str, int siz) と、ワーニングがでますd^^
yukkuri

2018/11/28 10:57

ちらっと調べましたが、かなり高い警告レベルでコンパイルするみたいですね。 何か理由がないのならいらないと思います。 また、分けて書く理由を追記します。
cateye

2018/11/28 11:15

ヘッダファイルの修正ミスとか見つけやすいので、上記オプションを使っています。まぁ、ワーニングについては自分で説明できる(理由がはっきりしてる)ものは無視していいので可能な限り出すようにしています。
h_proc

2018/11/28 12:23

回答ありがとうございます。 GCDでした。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問