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