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

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

ただいまの
回答率

90.33%

  • C

    4002questions

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

  • プログラミング言語

    704questions

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

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

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 914

kazu_4141

score 2

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

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

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;
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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すればいい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

以下、追記

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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

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

が挙げられます。

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

#include <stdio.h>

int main(void)
{
    int a,b;
    int gcd; 
    int count = 0;

    printf("a,b : "); 
    scanf("%d, %d", &a, &b); 

    while (a != b) {
        printf("%d回目: ",count++);
         if (a > b) {
             a = a - b;
         } 
         else if (a < b) {
             b = b - a;
         } 
         printf("a = %d b = %d \n",a,b);
    } 
    printf("a = bになりました。\n");
    gcd = a; 

    printf("gcd(a, b) = %d\n", gcd); 

    return 0;
} 


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

また、

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


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

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

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

#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 256

void my_gcd(int,int);

int main(void)
{
    char buf[BUFSIZE];
    int a,b;
    printf("数字を入力\n");
    printf("一つ目\n->");
    fgets(buf,BUFSIZE,stdin);
    a = strtol(buf,NULL,10);
    printf("二つ目\n->");
    fgets(buf,BUFSIZE,stdin);
    b = strtol(buf,NULL,10);

    my_gcd(a,b);
    return 0;
}

void my_gcd(int a, int b)
{
    int r = a % b;
    int count = 0;

    printf("%d ÷ %d = %d あまり %d\n",a,b,a / b, r);
    while(r != 0){
        printf("%d回目",++count);
        a = b;
        b = r;
        r = a % b;
        printf("%d ÷ %d = %d あまり %d\n",a,b,a / b, r);
    }
    printf("最大公約数は%d\n",b);
}


イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4002questions

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

  • プログラミング言語

    704questions

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