ページ 11

割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 00:28
by オルムント
こんにちは。
プログラムの作りかたをお聞きします。

整数をふたつ読み込み、どちらの数も割り切ることが
できる0 より大きい数でもっとも大きいものを見つける
プログラムの作り方を教えてください。


自分で試して
ひとつ読み込、割り切れる1より大きい数で一番小さいものを見つける
プログラムなら作ることが出来ました。


これを改造したら作れると思うのですが、
どこをどのように変えればいいのか教えてください。

おねがいします。


#include<stdio.h>

int
main()
{
int x,i;
scanf("%d",&x);

for(i=2;x%i;i++)
{
i==0;
}

printf("%d\n",i);


return 0;
}

Re:割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 00:46
by 管理人
えぇと、つまり最大公約数を見つけるプログラムですか?

for(i=2;x%i;i++)
{
i==0;
}

ここのとこの処理のしたい事がよくわかりません。
i==0は何を意味しようとしたのですか?

Re:割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 00:52
by オルムント
読み込んだ2つ数字の最大公約数を見つけるプログラムです。

for(i=2;x%i;i++)
{
i==0;
}

は読み込んだ数字を2から割っていって
あまりが0になったらfor文をやめるように
しようと思い書きました。

Re:割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 00:54
by オルムント
w←これ消してください。
気づかず投稿してしまいました。
すみません。

Re:割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 00:57
by Justy
整数をふたつ読み込み、どちらの数も割り切ることができる
0より大きい数でもっとも大きいものを見つける
 最大公約数のことでしょうか。

 最大公約数はユークリッドの互除法という方法で求めることができます(ググって見て下さい)。
 その方法も減算方式と剰余方式とありますが、剰余方式だと下のようになります。
[color=#d0d0ff" face="monospace]#include<stdio.h> 

int main(void) 
{ 
    int v1, v2, t, result;
    if(scanf("%d %d", &v1, &v2) == 2)
    {
        result = v1;
        while(v2 != 0)
        {
            t = result % v2;
            result = v2;
            v2 = t;
        }
        printf("result = %d\n", result);
    }
    return 0; 
}
[/color]

Re:割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 01:01
by 管理人
一番シンプルな形にするとこうなると思います。
#include <stdio.h>

int kouyakusu(int x, int y){
   if (!y) return x;
   return kouyakusu(y, x%y);
}

int main(){
   int x,y;
   scanf("%d %d",&x,&y);
   printf("最大公約数 : %d\n",kouyakusu(x,y));
   return 0;
}
これは再帰関数です。

後、
for(i=2;x%i;i++)
{
i==0;
}
これは確かに2から始まって割り切れる値まで来ると抜けていますが、
i==0はいらないんじゃないですか?
for(i=2;x%i;i++) ;
でいいと思います。

Re:割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 01:07
by 管理人
約数の1以外の最小の値は
#include<stdio.h> 

int main(){
	int x,i; 
	scanf("%d",&x); 
	for(i=2;x%i;i++) ;
	printf("%d\n",i); 
	return 0; 
}
となります。
for文のx%iはいい考えですね。

Re:割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 01:10
by オルムント
わかりやすい回答ありがとうございます。
こんな方法があったんですか!


参考にさせてもらい
do-while文でも作れると思い作って見ましたが
この書き方は正しいでしょうか?

#include<stdio.h>

int
main()
{
int x,i,y,k;
scanf("%d",&x);
scanf("%d",&y);
do{
k=x%y;
x=y;
y=k;
}
while(y !=0);

printf("%d\n",x);


return 0;
}

Re:割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 01:25
by 管理人
後判定する意味があるんでしょうか?

k=x%y

0で割ってはいけませんよね。
せっかく上記の式がエラーにならないように判定しているのに一度計算してから判定したのでは
判定する意味がないです。

値を入力するとき、2つ目の値を「0」にしてみてください。
きっとエラーになるはずです。

Re:割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 01:32
by オルムント
ほんとうですね!
0で割ったらエラーになってしまいました。

度々質問して
大切な時間を割いてもらい
さらに
親切な回答ありがとうございました。

Re:割り切れるものを探すプログラム

Posted: 2006年12月14日(木) 01:48
by 管理人
解決されたのでしたらよかったです。
頑張ってください☆