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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

4回答

1346閲覧

C言語プログラミング、最大公約数に関する質問です

kazu_4141

総合スコア6

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2018/01/13 07:12

編集2018/01/13 07:32

プログラミングの課題で自動版のプログラムにおいて、引き算の回数をカウントし、最大公約数が求まるまでの繰り返し回数も表示せよ。

という課題が出ました。
最大公約数を求めるところまでのソースコードは書けたのですが引き算の回数のカウントと繰り返し回数のところが分からないです。

#include <studio.h>

int main(void)
{
int a,b;
int gcd;

setbuf(stdout, NULL, _IINBF, 0); printf(“a,b : “); scanf(“%d, %d”, &a, &b); While (a != b) { if ( a > b) { a = a - b; } else if (a < b) { b = b -a; } else { printf(“a = bになりました。\n)( }

}

gcd = a; printf(“gcd(a, b) = %d\n”, gcd); return 0;

}

ここまではあっているでしょうか?

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

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

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

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

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

guest

回答4

0

一度に完成させるのは難しいので順番にやっていきましょう。

まずするべきことは、問題を読み直して確認することです。
問題の意味が理解できなければ先生や友達に聞いてください。
これが理解できるまで次に進んではいけません。

投稿2018/01/13 07:21

Zuishin

総合スコア28660

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

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

0

ここまではあっているでしょうか?

質問欄に提示されてあるコードを見て気づいたことを挙げると

(i)綴りミスがある
例えば、<studio.h> -> <stdio.h>, While -> whileです。

(ii)半角と全角が混じっている

(iii)printf()の中身が " "でくくられていない

が挙げられます。

ちなみに「引き算の回数のカウント」を加え,わたしなりに修正したものが以下のようになります。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int a,b; 6 int gcd; 7 int count = 0; 8 9 printf("a,b : "); 10 scanf("%d, %d", &a, &b); 11 12 while (a != b) { 13 printf("%d回目: ",count++); 14 if (a > b) { 15 a = a - b; 16 } 17 else if (a < b) { 18 b = b - a; 19 } 20 printf("a = %d b = %d \n",a,b); 21 } 22 printf("a = bになりました。\n"); 23 gcd = a; 24 25 printf("gcd(a, b) = %d\n", gcd); 26 27 return 0; 28} 29

.(ループさせる回数) = (引き算を行う回数)を記憶する変数としてcountを用意しループするたびに1増やせばいいです。

また、

C

1else{ 2 printf("a = bになりました。\n"); 3}

のところですが、a = bになったときにwhile文から抜け出すのでelseに行くことはありません。
よって、書くならwhile文の外に書きましょう。

最大公約数を求める有名な方法

最大公約数を求める有名な方法としてユークリッド互除法というのがあります。処理速度が速いです。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define BUFSIZE 256 5 6void my_gcd(int,int); 7 8int main(void) 9{ 10 char buf[BUFSIZE]; 11 int a,b; 12 printf("数字を入力\n"); 13 printf("一つ目\n->"); 14 fgets(buf,BUFSIZE,stdin); 15 a = strtol(buf,NULL,10); 16 printf("二つ目\n->"); 17 fgets(buf,BUFSIZE,stdin); 18 b = strtol(buf,NULL,10); 19 20 my_gcd(a,b); 21 return 0; 22} 23 24void my_gcd(int a, int b) 25{ 26 int r = a % b; 27 int count = 0; 28 29 printf("%d ÷ %d = %d あまり %d\n",a,b,a / b, r); 30 while(r != 0){ 31 printf("%d回目",++count); 32 a = b; 33 b = r; 34 r = a % b; 35 printf("%d ÷ %d = %d あまり %d\n",a,b,a / b, r); 36 } 37 printf("最大公約数は%d\n",b); 38} 39

イメージ説明

投稿2018/09/15 09:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

「引き算の回数をカウント」というのはよくわかりませんが、有名な最大公約数計算方法としてはユークリッドの互除法が挙げられます。以下、サンプル関数、動作未検証

C

1//0 < small <= largeについて、最大公約数を計算する関数の例 2int gcd(int large, int small) 3{ 4 return small ? gcd(small, large % small) : large; 5}

###以下、追記
あれ?課題文が追記されている。計算過程も表示する必要があるならば別の方法を使うわけにはいかないですね。

投稿2018/01/13 07:34

編集2018/01/13 07:39
HogeAnimalLover

総合スコア4830

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

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

0

while (a != b) { // a != b である間loopするのだから if ( a > b) { a = a - b; } else if (a < b) { b = b -a; } else { // ココに飛び込むことはない printf(“a = bになりました。\n)( } }

繰り返し回数が欲しいなら、このloopを回るたんびにテキトーな変数を+1すればいい。

投稿2018/01/13 07:34

編集2018/01/13 07:36
episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問