ページ 1 / 1
ループ文について
Posted: 2019年5月22日(水) 19:47
by robinson
aに正の数を代入してaが奇数の場合3かけて1たしたものを改めてaに代入し、aが偶数なら2でわってaに代入する。これを繰り返し1になったら終了する。
こういうプログラムがあって
コード:
#include<stdio.h>
int main(void){
int a;
printf("input->");
scanf("%d",&a);
while(a<=0){
printf("reinput->");
scanf("%d",&a);
}
while(a!=1){
if(a%2==1){
a=a*3+1;
printf("%d\n",a);
}
if(a%2==0){
a=a/2;
printf("%d\n",a);
}
}
printf("finish\n");
return 0;
}
このようなコードを打てばきちんとしたプログラムができるのですが、2つ目のwhile文のif文の位置を変えると無限ループに入りますが、原因がわかりません。どなたか原因のわかる方お願いいたします。
Re: ループ文について
Posted: 2019年5月22日(水) 21:49
by Math
これは 当たり前ですよね。
aに正の数を代入し といいながら 1 は 条件 while(a!=1){ ではじかれる。
したがって 終了条件は ”aが偶数なら2でわってaに代入する” 直前が 2 のときである。
しかし if の順 を逆にすると 折角 1 になったのに 1は奇数だから 4になり
4->2->1ー>4->2->1 の 無限ループになる。
( aが奇数の場合3かけて1たしたものを改めてaに代入し は奇数を 偶数化 するだけ )
Re: ループ文について
Posted: 2019年5月22日(水) 23:33
by robinson
a=1になればプログラムが終了すると思っていたのが盲点でした。
ご丁寧に教えていただきありがとうございます。
Re: ループ文について
Posted: 2019年5月23日(木) 23:29
by かずま
作りたいプログラムは、
コード:
a が 1 でない間繰り返す
a が奇数の場合
3を掛けて 1を足したものを a に代入
a が偶数の場合、
2で割って a に代入
ところが、元のプログラムの if(a%2==0){ の a は
最初の if(a%2==1){ の a と同じものではありません。
a=a*3+1; で変更された結果の a である場合があります。
つまり、
コード:
a が奇数の場合
3を掛けて 1を足したものを a に代入し、それを 2で割って a に代入
となっています。
正しくするには、次のように else を使わないといけません。
コード:
if (a % 2 == 1) {
a = a * 3 + 1;
printf("%d\n", a);
}
else { // else if (a % 2 == 0) { と書いても同じだが無駄
a = a / 2;
printf("%d\n", a);
}
Re: ループ文について
Posted: 2019年5月28日(火) 21:00
by Math
君の頭の中では
コード:
while(1){
if(a%2==0){
a=a/2;
printf("%d\n",a);
}
if( a==1)break;
if(a%2==1){
a=a*3+1;
printf("%d\n",a);
}
}
だったんだろうが
実際には
コード:
while(1){
if( a==1)break;
if(a%2==0){
a=a/2;
printf("%d\n",a);
}
if(a%2==1){
a=a*3+1;
printf("%d\n",a);
}
}
だからね。
フローチャートを思い浮かべるといいすよ。
何千行、何万行と書くとつまらないことに引っかかて何日もロスるよね!(^^;