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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

4回答

2946閲覧

関数の戻り値が0になってしまう

langhtorn

総合スコア104

C

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/06/23 09:40

###実現したいこと
関数int gcd(int x,int y)を作って最大公約数を求めたい。
ユーグリッド互除法を使う
###問題点
戻り値ansが0になってしまう。

2つの正整数x,yを入力 391 493 デバック最大公約数0 デバック最大公約数0 391と493の最大公約数は0なので互いに素ではない

###試したこと
if(x<y)を消してやってみたが実行結果が変わらなかったのでここは合っている。
gcd関数内のansの出力で0となったのでint main内の間違えではない。
###参考
こちらを参考にしてみましたが分かりませんでした。→ユーグリッド互除法
よろしくお願いします!
###コード

C

1#include<stdio.h> 2 3//ユーグリッドの互除法を用いて2つの正の整数の最大公約数を求める関数 4int gcd(int x,int y) 5{ 6 int tmp=0; 7 int ans=0; 8 //xよりyが大きければ入れ替える 9 if(x<y){ 10 tmp=x; 11 x=y; 12 y=tmp; 13 } 14 15 //ユーグリッド 16 while(ans!=0){ 17 ans=x%y; 18 x=y; 19 y=ans; 20 } 21 printf("デバック最大公約数%d\n",ans); 22 return ans; 23} 24 25int main(void) 26{ 27 int x,y; 28 int n=0; 29 30 //1が入力されたらループを抜ける 31 while(1){ 32 printf("2つの正整数x,yを入力 "); 33 scanf("%d",&x); 34 scanf("%d",&y); 35 if(gcd(x,y)==1){ 36 printf("%dと%dの最大公約数は1なので互いに素である\n",x,y); 37 }else{ 38 printf("%dと%dの最大公約数は%dなので互いに素ではない\n",x,y,gcd(x,y)); 39 } 40 printf("終了しますか? "); 41 scanf("%d",&n); 42 if(n==1){ 43 break; 44 } 45 } 46 return 0; 47} 48

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

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

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

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

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

guest

回答4

0

ベストアンサー

c

1 while(ans!=0){ 2 ans=x%y; 3 x=y; 4 y=ans; 5 }

の部分がwhileの継続条件が最初から満たされていないので(ans=0)一度もユークリッドの互除法を実行していません。

投稿2020/06/23 09:54

Penpen7

総合スコア698

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

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

maisumakun

2020/06/23 09:55

おっと、そっちも問題だった
Penpen7

2020/06/23 09:59

int gcd(int a,int b){ int r; while(r!=0){ r=a%b; a=b; b=r; } return a; } そもそも、参考にしたサイトのソースコードもまずそうです。 int r;でrを宣言しながら、初期化せずにwhile(r!=0)という風に条件に突っ込んでしまっています...
langhtorn

2020/06/23 10:14

継続条件を満たすように書き換えたらできました。ありがとうございました。
guest

0

できたものはこちらです。
皆さんありがとうございます!
すみません訂正します。

C

1#include<stdio.h> 2 3//ユーグリッドの互除法を用いて2つの正の整数の最大公約数を求める関数 4int gcd(int x,int y) 5{ 6 int tmp=0; 7 int ans=0; 8 //xよりyが大きければ入れ替える 9 if(x<y){ 10 tmp=x; 11 x=y; 12 y=tmp; 13 } 14 15 //ユーグリッド 16 while(y!=0){ 17 ans=x%y; 18 x=y; 19 y=ans; 20 } 21 return x; 22} 23 24int main(void) 25{ 26 int x,y; 27 int n=0; 28 29 //1が入力されたらループを抜ける 30 while(1){ 31 printf("2つの正整数x,yを入力 "); 32 scanf("%d",&x); 33 scanf("%d",&y); 34 if(gcd(x,y)==1){ 35 printf("%dと%dの最大公約数は1なので互いに素である\n",x,y); 36 }else{ 37 printf("%dと%dの最大公約数は%dなので互いに素ではない\n",x,y,gcd(x,y)); 38 } 39 printf("終了しますか? "); 40 scanf("%d",&n); 41 if(n==1){ 42 break; 43 } 44 } 45 return 0; 46} 47 48/*実行結果 492つの正整数x,yを入力 391 493 50391と493の最大公約数は17なので互いに素ではない 51終了しますか? 0 522つの正整数x,yを入力 391 494 53391と494の最大公約数は1なので互いに素である 54終了しますか? 0 552つの正整数x,yを入力 2244646 7859899 562244646と7859899の最大公約数は1819なので互いに素ではない 57終了しますか? 1 58*/

投稿2020/06/23 10:16

編集2020/06/24 09:59
langhtorn

総合スコア104

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

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

episteme

2020/06/23 10:25

間違ってます。 gcd(100,50) が 100 を返します。50が正解でしょ?
Penpen7

2020/06/23 19:50 編集

試してみましたが、間違えた答えが出ます。 while文の前にあるans=x%y;は最終結果に影響しない演算で、while文に入るため以上の意味を持たないため、不要です。 ヒントとしては、whileの継続条件にansを使わない方法を考えてみてください。 もしわからない場合は、while文の処理を繰り返し追っていって、結果が出てきた時のx, yの値がどうなっているか紙に書き出したりしてみてください。
guest

0

C

1 ... 2 while(ans!=0){ /* ansがでない間繰り返すから */ 3 ans=x%y; 4 x=y; 5 y=ans; 6 } 7 /* whileを抜けたら ansは0に決まってる */ 8 printf("デバック最大公約数%d\n",ans); 9 return ans; /* だからコタエが常に0なのはアタリマエ */ 10}

投稿2020/06/23 10:00

episteme

総合スコア16614

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

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

langhtorn

2020/06/23 10:13

whileについてじっくり考えなおしたらわかりました。ありがとうございました。
guest

0

while(ans!=0)でループを回していますので、当然ループを抜けたときはans == 0です。

ansではなくxを返すのが妥当かと思います。

投稿2020/06/23 09:52

編集2020/06/23 09:53
maisumakun

総合スコア145184

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

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

langhtorn

2020/06/23 10:15

return x; にしたらできました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問