ページ 11

配列 c に格納されたすべての公約数を表示するプログラム

Posted: 2010年12月09日(木) 17:23
by Hirose
最大公約数を計算する関数 int gcd( int a, int b) を利用して,2つの自然数 a, b に対し,その公約数をすべて求め,int型配列 c に格納する関数 void cd(int a, int b, int c[]) を作成し、main関数で 2つの自然数 a,b を入力させ,関数 cd を呼び出し,配列 c に格納されたすべての公約数を表示するプログラムを作成したいです。たとえば、a = 2400, b = 2040 のとき,公約数は 1 2 3 4 5 6 8 10 12 15 20 24 30 40 60 120 となるようにしたいです。
作ってみたのですが、うまく動きません。
どこがちがうのでしょうか?
教えてください。
お願いします。

#include<stdio.h>
void cd(int a, int b, int c[]);

int main(void)
{
int a,b,y;
printf("a");
scanf("%d",&a);
printf("b");
scanf("%d",&b);

y=cd(int a,int b,int c[]);
printf("%d",y);

return 0;
}



void cd(int a, int b, int c[])
{
int x,y;
y=1;

for(x=2;x<=a;x++)
{
if(a%x==0&&b%x==0)
{
y=x;
}
}
}

Re: 配列 c に格納されたすべての公約数を表示するプログラム

Posted: 2010年12月09日(木) 17:53
by bitter_fox
問題点がいくつかあります。

y=cd(int a,int b,int c[]);
1.cdの戻り値はvoidなのに受け取ろうとしている。
2.int a, int bが再び宣言されている。
3.次の問題点と深く関係しますが、int c[]とした受け渡しは望んでいる結果にならない。

void cd(int a, int b, int c[])
4.int c[]として、配列に代入したつもりでも、この関数を出るとそれらの数値は呼び出し元に引き継がれません。
int *c[] とするべきです。
またそれに伴って、以後の配列cへの代入の仕方も変わってきます。

5.関数内で、配列cに一切代入していないです。

ぱっと見これぐらいありました。

Re: 配列 c に格納されたすべての公約数を表示するプログラム

Posted: 2010年12月09日(木) 18:12
by Hirose
では、具体的に私が作りたいプログラムをソースコードで書くにはどうすればよいですか?
まったく分からないので、丸投げみたいになってしまいますが、よろしくお願いします。

Re: 配列 c に格納されたすべての公約数を表示するプログラム

Posted: 2010年12月09日(木) 18:21
by non
まるなげはまずいので、まず、最大公約数を計算する関数 int gcd( int a, int b)
のコードを載せてよ。

Re: 配列 c に格納されたすべての公約数を表示するプログラム

Posted: 2010年12月09日(木) 18:22
by bitter_fox
まず、main関数内で、配列cを適切な大きさで確保します。

次に、cdを呼び出す際、cの先頭のアドレスを渡してあげる必要があります。
&cという風にします。

最後に代入は、
*c[n] = v;
nは添え字です。この添え字は(確保時の大きさ-1)を超えてはいけません。
vはvalue(値)の、略ですので、適切に変えてください。
[hr]nonさん>>そうですね。僕もそれが気になりました。gcdはいったいどこに蒸発したのでしょうか??