C言語関係掲示板

過去ログ

No.1107 最小公倍数を求めるプログラム

[戻る] [ホームページ]
No.1791

初めまして
投稿者---xtsubasa(2004/05/20 20:59:59)


初めまして。xtsubasaといいます。
C歴0.5ヶ月未満の、超赤ん坊です。
最小公倍数を求める計算プログラムを作ろうと思っても、
ぜんぜんできません。
自分で何度も修正したつもりでも、できません。
誰か、ヒントだけでもください。
よろしくお願いします。
下に最終プログラムを載せておきます。

#include

int foo(int o,int p)
{
int z,m,n;

m=o;
n=p;
z=0;

do {
if(o=p)
z=1;
if(o o=o+m;
if(o>p)
p=p+n;
} while (z !=0);

return o;
}

main()
{
int a=0,b=0,c;


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

c=foo(a,b);

printf("%d",c);

return 0;
}



No.1792

Re:初めまして
投稿者---monkey(2004/05/20 22:18:47)


コメント参照

#include <stdio.h> // scanf, printfを使うためのヘッダファイル

int foo( int o, int p )
{
    int z, m, n;

    m = o;
    n = p;
    z = 0;

    do{
        if( o == p ) // ==演算子でなくちゃ
            z = 1;
        else if( o < p ) // 条件式はこうでしょ?
            o = o + m;
        else if( o > p ) // この場合,elseだけでもよい
            p = p + n;
    }while ( z == 0 ); // 演算子を訂正

    return o;
}


おまけ:
同じアルゴリズムを使うのでも,foo関数定義はもう少し簡潔にすることができまっせ.

int foo( int o, int p )
{
    int m = o, n = p;

    while( o != p )
    {
        if( o < p )
            o += m;
        else
            p += n;
    }

    return o;
}


変数名oは数字の0と紛らわしいので,ワタシは使いたくないなぁ...


No.1794

Re:初めまして
投稿者---monkey(2004/05/20 22:22:17)


あ,もしかして,xtsubasaさんのコードは,HTML変換に失敗してあちこち抜けていたのかな?
おそらく,致命的だったのは,do〜whileの条件式の間違いだけだったのでしょう.



No.1796

Re:初めまして
投稿者---monkey(2004/05/20 22:35:45)


わわ,RAPTさんやぽこさんの的確なコメントが!
コードの修正まで書いてしまったのはxtsubasaさんのためにならなかったかな...


No.1793

Re:初めまして
投稿者---RAPT(2004/05/20 22:21:29)


ソースは、コンパイル可能な状態で掲載してください。
また、ソースが未完成の場合、アルゴリズム(考え方)を
きちんと記載してください。

あなたの場合、最小公倍数の求め方が分からないのか、
C言語のソースが分からないのか、が不明瞭です。

まず、最小公倍数の求め方が分からないのなら、Google等で検索するなど、
まずはその考え方について勉強する必要があり、それはここではありません。

最小公倍数を求める道筋を確立したら、あとはそれをコードに起こすだけです。


No.1795

Re:初めまして
投稿者---ぽこ(2004/05/20 22:23:44)


>誰か、ヒントだけでもください。

「(ユークリッドの)互除法」を用いて最大公約数を求め、
その後に最小公倍数を求めてはいかがでしょうか?


No.1800

Re:初めまして
投稿者---xtsubasa(2004/05/22 09:09:28)


最小公倍数の求め方として、考えたのが、
1. 数値を入力してもらう
2. 数値Aと数値Bとする。
3. Aと同じA´と、Bと同じB´を仮定させる
4. もし、AとBが同じなら、それ。
5. もし、Aが小さければ、AにA´を足す
6. もし、Bが小さければ、BにB´を足す
7. 4〜6の繰り返し
8. 答え表示

というようにしたつもりでした。
HTML変換ツールがあったことは、まったく知りませんでした。
ですが、コメントがたくさんあったので、うれしかったのも事実です。
互除法は、勉強しておきます。
コメントしてくださった方々、ありがとうございました。


No.1801

Re:初めまして
投稿者---ぽこ(2004/05/22 16:55:38)


>互除法は、勉強しておきます。
>コメントしてくださった方々、ありがとうございました。

互除法を用いて最大公約数、最小公倍数を求めるプログラムです。
int gcd():最大公約数を求める関数。
int lcm():最小公約数を求める関数。

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

int gcd(int a, int b);
int lcm(int a, int b);

int main(int argc, char * argv[])
{
  int a = atoi(argv[1]);
  int b = atoi(argv[2]);

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

  return 0;
}

int gcd(int a, int b)
{
  int tmp = a % b;

  if(tmp == 0) {
    return b;
  } else {
    return gcd(b, tmp);
  }
}

int lcm(int a, int b)
{
  return a * b / gcd(a, b);
}