【C++】2つの乱数の公約数を表示するプログラムの書き方を教えてください。コンパイラはTurboC++です。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/12/07 11:54:24
  • 終了:--

回答(1件)

id:caq No.1

caq回答回数34ベストアンサー獲得回数02004/12/07 12:02:41

ポイント40pt

最大公約数ですか?それならばユークリッドの互除法を使えばよいです。

int a,b,c,answer;

a=32;

b=20;

while(c != 0){

a%b =c;

a=b;

b=c;

}

answer = a;

aとbに二つの乱数を入れて、出てきたanswerが最大公約数です。

id:yutaka_z

どうもありがとうございました

2004/12/07 12:08:04
  • id:taknt
    問題は・・・

    乱数の発生のさせ方だよね。

    いくつからいくつまでとか、小数点はどうするのか?とか。
  • id:EddyYamanaka
    1.回答者:caq さんの回答って

    C or C++ で動きますか?
    いきなり while(c != 0) って、c の初期値は?
    a%b =c; って何?

  • id:EddyYamanaka
    Re:問題は・・・

    >乱数の発生のさせ方だよね。
    >いくつからいくつまでとか、小数点はどうするのか?とか。
    そうそう。
    そして「結果を表示するプログラム」を求めてますよね?
    回答者さんのプログラムは乱数発生も結果表示も無く、文法もC++じゃないし…
  • id:crowdeer
    Re:問題は・・・

    >乱数の発生のさせ方だよね。
    >
    >いくつからいくつまでとか、小数点はどうするのか?とか。
    >
    横槍失礼します。
    約数は「ある1以上の自然数に対して、割り切ることができる1以上の自然数
    のこと」(はてなダイアリーキーワード「約数」より引用)なので、どうするもこうするも小数点以下が出る乱数は発生させたらあかんでしょ。

    あと、回答の方ですが、質問には「2つの乱数の公約数を表示したい」と書いてあるので”最大”公約数だけでは不十分だと思いますがいかがでしょうか。まぁ最大公約数を算出してからその約数を表示すればいいんですけどね。
  • id:crowdeer
    Re(2):問題は・・・

    >>乱数の発生のさせ方だよね。
    >>
    >>いくつからいくつまでとか、小数点はどうするのか?とか。
    >>
    >横槍失礼します。
    >約数は「ある1以上の自然数に対して、割り切ることができる1以上の自然数のこと」(はてなダイアリーキーワード「約数」より引用)なので、どうするもこうするも小数点以下が出る乱数は発生させたらあかんでしょ。
    >
    >あと、回答の方ですが、質問には「2つの乱数の公約数を表示したい」と書いてあるので”最大”公約数だけでは不十分だと思いますがいかがでしょうか。まぁ最大公約数を算出してからその約数を表示すればいいんですけどね。
    >
    自己レス。
    takntさんは回答者の乱数自体の発生仕方に対して言ってたわけですね。
    一人空回りしたコメントしていました。申し訳ございません。
  • id:caq
    レス〜

    >C or C++ で動きますか?
    >いきなり while(c != 0) って、c の初期値は?
    >a%b =c; って何?
    >
    このままだと動かないッスよ。cやc++の文法じゃないですし。
    main関数もなければ、stdio.hもインクルードしてないし。
    質問が「2つの乱数の公約数を表示するプログラムの書き方を教えてください」なので、たぶん最大公約数を求めるプログラムが書きたいんだろうなァという推測で、最大公約数を求める部分のアルゴリズムを書いただけです。公約数全部出すなら、二つの乱数のうち大きいほうの数までインクリメントしながら割り切れるの探してくのが、頭は悪いですがめんどくなくて良いかと。

    cなら、
    #include <stdio.h> /* printf() */
    #include <stdlib.h> /* rand() */
    #define MAX 100

    int main(void){
    int a,b,c,answer;
    a = 0;b = 0;c = 0;answer = 0;
    a = rand() % MAX;
    b = rand() % MAX;
    while(c != 0){
    c = a%b;
    a = b;
    b = c;
    }
    answer = a;
    printf(”%d”,anwer);

    return 0;
    }
    とかすかね。srand()設定しないと同じ乱数列になりますが。
  • id:caq
    Re:レス〜

    なんていうんでしょう。ソース見せてくれじゃなくて「プログラムの書き方」を教えてくれだったので、やり方だけ教えてほしいのかなァとか考えたのです。

    http://www.kurumi.sakura.ne.jp/~kumicyou/cplusplus/teachyourselfcpp/gcd.html
    この辺とか、いくらでもソースは転がってるんですが、これって「書き方」じゃあないなあとか。むー。考えすぎなのでしょうか。
  • id:EddyYamanaka
    Re:レス〜

    「最大」だけじゃない『公約数』なら、最後に素因数分解する?
    (公約数って”1”を含んだっけ? 含むんだったら最後に”1”の表示を追加してください)

    #include <stdio.h>

    #define R_MIN 1
    #define R_MAX 1000

    #define R_PRM (R_MAX - R_MIN + 1)

    int gcm(int a, int b)
    {
     if (!b) return a;
     return gcm(b, a % b);
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
     int a, b, c, d;

     a = R_MIN + random(R_PRM);
     b = R_MIN + random(R_PRM);
     c = gcm(a, b);
     d = 2;
     printf(”GCM = %d¥n”, c);
     while (c >= d * d) {
      if ((c % d) == 0) {
       printf(” CM = %d¥n”, c, d);
       c /= d;
      }
      else {
       d += 1;
      }
     }
     printf(” CM = %d¥n”, c);
     return 0;
    }
  • id:caq
    Re(2):レス〜

    ん?公約数に1は含みますけど、最大公約数を素因数分解したのが公約数じゃないっスよ。
    「aの約数でもあり,bの約数でもある整数をaとbの公約数という」というのが定義のハズです。

    たとえば、24と36の最大公約数は12ですけど、
    24の約数が、1,2,3,4,6,8,12,24で
    36の約数が、1,2,3,4,6,9,12,18,36っスよね?
    この場合、公約数は1,2,3,4,6,12になります。

    >printf(” CM = %d¥n”, c, d);
    このあたりの文法がTurboC++特有だったりすると、きちんと出てる可能性もあるんですけど、たぶん上記のプログラムじゃあでないんでないスか?
  • id:caq
    Re(2):レス〜

    のでー、公約数をコンソールに表示させるならこんな感じかと。

    #include <stdio.h> /* printf() */
    #include <stdlib.h> /* rand() */
    #define MAX 100 /* 乱数は、0から99の間で出てくる */

    int main(void){
    int a,b,c,answer;
    a = 0;b = 0;c = 0;answer = 0;
    a = rand() % MAX;
    b = rand() % MAX;

    for(c=1; c <= a; ++c){
    if( a%c == 0){
    if( b%c == 0){
    printf(”%d ”,c);
    }
    }
    }

    return 0;
    }

    …ただまあ質問された方がふるーいTurboC++使ってて、コレ(http://www.borland.co.jp/bcsuite/tc40j.html)じゃ無い可能性もあるので、ANSI C準拠だからといって油断はできないわけですが。
  • id:EddyYamanaka
    Re(3):レス〜

    >ん?公約数に1は含みますけど、最大公約数を素因数分解したのが公約数じゃないっスよ。
    >「aの約数でもあり,bの約数でもある整数をaとbの公約数という」というのが定義のハズです。

    そうでしたネ。
    もうウン十年も昔の話なので…

    >>printf(” CM = %d¥n”, c, d);
    >このあたりの文法がTurboC++特有だったりすると、きちんと出てる可能性もあるんですけど、たぶん上記のプログラムじゃあでないんでないスか?

    すみません。”c”だけでいいです。
    動作確認のために d の値を表示していたので… (^^;;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません