🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

解決済

2回答

4531閲覧

C言語にてユークリッドの互除法を用いず最小公倍数、最大公約数を表示したい。

hayato208

総合スコア19

C

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

0グッド

0クリップ

投稿2019/12/14 10:20

編集2019/12/14 13:41

前提・実現したいこと

プロトタイプ宣言を使用して入力された任意の二つの整数n1,n2の最小公倍数、最大公約数を表示したい。
ただし、最大公約数はユークリッドの互除法を用いずに計算したい。

発生している問題・エラーメッセージ

ソースコードのMAXgcd(最大公約数)に一度該当する値が入力されたらそれ以降の値が入力されていないのだと推測しています。
例を挙げるとn1=30、n2=15とした場合、for文がm=1の場合はMAXgcd=1となる。ここでm=7とすればMAXgcd=15となる。
おそらく一度if文が真となるmが入力されればfor文から抜けているのではないか。
コンパイルエラーメッセージは下記の通りです。

Main.c:13:18: warning: variable 'm' is uninitialized when used here [-Wuninitialized] MAXgcd = gcd(m,n1,n2); ^ Main.c:9:10: note: initialize the variable 'm' to silence this warning int m,n1,n2,MAXgcd; ^ = 0 Main.c:26:1: warning: control may reach end of non-void function [-Wreturn-type] }

該当のソースコード

C

1//6-9 2#include <stdio.h> 3 4//プロトタイプ宣言 5int gcd(int,int,int); 6int lcm(int,int,int); 7 8int main(void){ 9 int m,n1,n2,MAXgcd; 10 scanf("%d %d",&n1,&n2); 11 printf("1つ目の値を入力してください%d\n",n1); 12 printf("2つ目の値を入力してください%d\n",n2); 13 MAXgcd = gcd(m,n1,n2); 14 printf("2つの数の最大公約数は、%dです。\n",MAXgcd); 15 printf("2つの数の最小公倍数は、%dです。\n",lcm(n1,n2,MAXgcd)); 16} 17 18 19//最大公約数を計算する関数 20int gcd(int m,int n1,int n2){ 21 for(m = 8 ; m <= n1 || m <= n2 ; m++){ 22 if(n1 % m == 0 && n2 % m == 0){ 23 return m; 24 } 25 } 26} 27 28//最小公倍数を計算する関数 29int lcm(int n1,int n2,int MAXgcd){ 30 return (n1 * n2) / MAXgcd; 31}

試したこと

プロトタイプ宣言関係の処理を削除した下記内容では問題なく動きました。
そのため、おそらくプロトタイプ宣言関係の処理が上手くいってないのだと思います。

C

1#include <stdio.h> 2 3int main(void){ 4 int m,n1,n2,MAXgcd,MINlcm; 5 scanf("%d %d",&n1,&n2); 6 printf("1つ目の値を入力してください%d\n",n1); 7 printf("2つ目の値を入力してください%d\n",n2); 8 //最大公約数を計算する関数 9 for(m = 1 ; m <= n1 || m <= n2 ; m++){ 10 if(n1 % m == 0 && n2 % m == 0){ 11 MAXgcd = m; 12 } 13 } 14//最小公倍数を計算する関数 15 MINlcm = (n1 * n2) / MAXgcd; 16 printf("2つの数の最大公約数は、%dです。\n",MAXgcd); 17 printf("2つの数の最小公倍数は、%dです。\n",MINlcm); 18}

注文が多いですが、お力添えしていただけると助かります。

補足情報(FW/ツールのバージョンなど)

用いているツールはpaizaです。

上記処理の解決方法

C

1#include <stdio.h> 2 3//プロトタイプ宣言 4int gcd(int,int); 5int lcm(int,int,int); 6 7int main(void){ 8 int n1,n2,MAXgcd; 9 scanf("%d %d",&n1,&n2); 10 printf("1つ目の値を入力してください%d\n",n1); 11 printf("2つ目の値を入力してください%d\n",n2); 12 MAXgcd = gcd(n1,n2); 13 printf("2つの数の最大公約数は、%dです。\n",MAXgcd); //mのスコープ範囲をint bcdに移動 14 printf("2つの数の最小公倍数は、%dです。\n",lcm(n1,n2,MAXgcd)); 15} 16 17 18//最大公約数を計算する関数 19int gcd(int n1,int n2){ 20 int m,MAX; 21 for(m = 1 ; m <= n1 || m <= n2 ; m++){ 22 if(n1 % m == 0 && n2 % m == 0){ 23 MAX = m; //最大公約数をint型MAXに格納 24 } 25 } 26 int r = MAX; 27 return r; //最大公約数MAXをreturnで返す 28} 29 30//最小公倍数を計算する関数 31int lcm(int n1,int n2,int MAXgcd){ 32 return (n1 * n2) / MAXgcd; 33}

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

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

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

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

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

guest

回答2

0

for(m = 8 ; m <= n1 || m <= n2 ; m++){

m は、下は 1 なのに、なぜここでは 8 ?

for(m = 1 ; m <= n1 && m <= n2 ; m++){

でいいんじゃないですか?

指摘済みのところですが、
return m のところは、ほかの保持する変数に格納する必要があります。
最後にその値をreturn します。

投稿2019/12/14 12:21

編集2019/12/14 12:26
PingHermit

総合スコア478

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

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

hayato208

2019/12/14 13:35

m = 8は私の誤字でした、すみません。 return mの部分を他の変数に保持し、最後にreturnすればよかったのですね、それを勘違いしておりました。 その勘違いを正してくださったおかげで無事解決しました、ありがとうございました。
guest

0

ベストアンサー

MAXgcd = gcd(m,n1,n2);

なぜ gcd は m をパラメータで貰っているのでしょうか. しかもその m は初期化されていません.
さらに, gcd は( if 文に引っかからずに) for を回り切った場合にも int 値を返す必要がありますが, それがありません.

投稿2019/12/14 10:43

jimbe

総合スコア13201

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

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

hayato208

2019/12/14 13:33

mainの部分にmを表示するためにmを貰っておりましたが、ご指摘を踏まえてint gcdのローカル変数で変えてみたところエラーはなくなりました。 また、forの中でintを返しておりましたが、それをfor外にしたところ無事動きました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問