- ベストアンサー
最大公約数と最小公倍数を求めるプログラム
- C言語で2つの整数の最大公約数と最小公倍数を求めるプログラムをご紹介します。
- その中でも最小公倍数を求める方法を説明します。
- また、自然数n以下でx^2+y^2=z^2を満たす自然数の組(x,y,z)を求めるプログラムについてもお教えします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
本当は、もっと使い回しの利くように作ればいいんでしょうが… とりあえず、#1で言っていることをプログラムにしたものです。 #include <stdio.h> void main(void){ int a,b; int x,y; int i; /* a と b の共通の約数を求める */ a=156; b=768; if(a>b){ /* x<=yにする */ x = b; y = a; } else { x = a; y = b; } printf("%d と %d の共通約数は、",a,b); for(i=1;i<=x;i++){ if(x % i == 0){/* i は、x の約数 */ if(y % i == 0){/* i は、y の約数でもある */ printf("%d ",i); } } } }
その他の回答 (6)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#2>このforの中でprintfを表示させることで、全ての公約数を表示させることができるとゆうことですかね?? まあ、そうだと思いますけど・ 表示させたいということだったので表示しているので、必要充分かと・ 使い回しが利くようにするには、可変長のデータを保持できるような(例えばリストのような)データ構造が必要かと思いますが、それは、また別の話。 #2>if(x % i == 0)&&(y % i == 0) そうですね。 if((x % i == 0)&&(y % i == 0)) で動作は同じになると思います。 xのテストが左に書いてあるのがミソで、同じようでも if((y % i == 0)&&(x % i == 0)) だと動作が変わってしまうので注意が必要です。 ポイントは、x % i == 0の時だけy % i == 0が評価される(計算される)というところですね。 C言語では、そういう動作が期待できますが、そういう動作をしない言語処理系もあるかもしれません。 まあ、意味をはっきりさせる意味で、ああしています。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#5は間違い /* x^2+y^2=z^2 (x<y)を満たすようなn以下の自然数の組(x,y,z)がいくつあるか? */ #include <stdio.h> #include <math.h> void main(void){ unsigned long x,y,z,n; unsigned long x2,wk; unsigned limit,c; n=100;c=0; limit = n/sqrt(2.0)+1;/* A^2+A^2<=N^2 → A< N/√2 + 1 */ for(x=1;x<limit;x++){ x2=x*x; for(y=x+1;y<n;y++){ z=sqrt(wk=x2+y*y)+0.5; if(z<=n && wk==z*z){ printf("(x,y,z)=(%lu,%lu,%lu)\n",x,y,z); c++; } } } printf("計:%lu組\n",c); }
お礼
色々とありがとうございます!!
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
/* x^2+y^2=z^2 (x<y)を満たすようなn以下の自然数の組(x,y,z)がいくつあるか? */ #include <stdio.h> #include <math.h> void main(void){ unsigned long x,y,z,n; unsigned long x2,wk; unsigned limit,c; n=100;c=0; limit = n/sqrt(2.0)+1;/* A^2+A^2<=N^2 → A< N/√2 + 1 */ for(x=1;x<=limit;x++){ x2=x*x; for(y=x+1;y<=limit;y++){ z=sqrt(wk=x2+y*y)+0.5; if(wk==z*z){ printf("(x,y,z)=(%lu,%lu,%lu)\n",x,y,z); c++; } } } printf("計:%lu組\n",c); }
- toukou_desu
- ベストアンサー率0% (0/1)
#3です。間違いだらけです・・・ GCM=1のときに互いに疎です。ハイ。 nがごっちゃになっていてわかりづらいです。これも申し訳アリマセン。書き直しました・・・ n以下のピタゴラス数を求めるんですね? ピタゴラス数はα,βが互いに疎で一方が偶数、一方が奇数(α>β)のとき、 α^2+β^2、α^2-β^2、2αβで表されるけど、α,βが互いに疎かどうかをGCMを求めて判定しているんですよね?? α,βを適当に決めて(総当りで)α,βのGCMを求めて、GCM=1のとき上記3式を計算すればピタゴラス数(x,y,z)が出ます。 ちなみにx<y<zの関係があります。 再度その3数x,y,zがある数n以下かどうかを判定し、マッチしていれば表示していけばよいです。
- toukou_desu
- ベストアンサー率0% (0/1)
n以下のピタゴラス数を求めるんですね? ピタゴラス数はm,nが互いに疎で一方が偶数、一方が奇数(m>n)のとき、 m^2+n^2,m^2-n^2,2mnで表されるけど、m,nが互いに疎かどうかをGCMを求めて判定しているんですよね?? m,nを適当に決めて(総当りで)m,nのGCMを求めて、GCM>1のとき上記3式を計算すればピタゴラス数が出ます。 再度その3数がある数以下かどうかを判定し、マッチしていれば表示していけばよいです。 私はそうやって「ピタゴラス星雲」を描きました!
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>全ての公約数 AとBの数字のうち小さい方をXとして、 Xの約数を求める、 求めた約数のウチもう一方の約数になっているか調べる。 なっていたら、公約数。 n以下の自然数の組 n以下の意味は、 x,y,zそれぞれが0<X≦nの意味ですか それとも x+y+z≦nの意味?
補足
>全ての公約数 意味はわかるのですが、printf()の中身など、どうやって全ての約数を表示させるのかがいまいちわかりません。scanfでばらばらの数値を入れるので公約数がいくつ出てくるのかもわからないので。。プログラムで書くとどうゆう風になるかが検討がつかなくて。。 x,y,zそれぞれが0<x,y,z≦nの意味です!
補足
for(i=1;i<=x;i++){ if(x % i == 0){/* i は、x の約数 */ if(y % i == 0){/* i は、y の約数でもある */ printf("%d ",i); このforの中でprintfを表示させることで、全ての公約数を表示させることができるとゆうことですかね?? あと、 if(x % i == 0) if(y % i == 0) の部分は if(x % i == 0)&&(y % i == 0) でも良いのでしょうか??