アプリ版:「スタンプのみでお礼する」機能のリリースについて

#include <stdio.h>
int gcd2(int a, int b)
{
if (!b) return a;
return gcd2(b, a%b);
}

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

printf("2つの任意の整数を入力せよ:");
scanf("%d %d",&a,&b);
c=gcd2(a,b);
printf("最小公倍数は%d\n",a*b/c);
printf("最大公約数は%d\n",c);

return 0;
}

で、最小公約数を出すことはできたのですが、全ての公約数を表示させたいんです!!どうやったらいいのでしょうか??プログラミングまだ初心者なので、ちょっと行き詰ってしまいました。。。
お時間があればでいいのですが、もう一つわからないプログラムがあります。
自然数nを入力し、x^2+y^2=z^2 (x<y)を満たすようなn以下の自然数の組(x,y,z)がいくつあるのかを出力するプログラムなのですが、全くわからず行き詰っています。。どなたかお時間があれば教えて頂きたいです。
色々と申し訳ありません。お願いします(__)

A 回答 (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);
}
}
}
}

この回答への補足

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)
でも良いのでしょうか??

補足日時:2005/04/24 18:03
    • good
    • 0

#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言語では、そういう動作が期待できますが、そういう動作をしない言語処理系もあるかもしれません。
まあ、意味をはっきりさせる意味で、ああしています。
    • good
    • 0

#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);
}
    • good
    • 0
この回答へのお礼

色々とありがとうございます!!

お礼日時:2005/04/24 18:02

/*


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);
}
    • good
    • 0

#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以下かどうかを判定し、マッチしていれば表示していけばよいです。
    • good
    • 0

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数がある数以下かどうかを判定し、マッチしていれば表示していけばよいです。
私はそうやって「ピタゴラス星雲」を描きました!
    • good
    • 0

>全ての公約数


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の意味です!

補足日時:2005/04/24 02:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!