前提・実現したいこと
プロトタイプ宣言を使用して入力された任意の二つの整数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}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/14 13:35