aに正の数を代入してaが奇数の場合3かけて1たしたものを改めてaに代入し、aが偶数なら2でわってaに代入する。これを繰り返し1になったら終了する。
こういうプログラムがあって
このようなコードを打てばきちんとしたプログラムができるのですが、2つ目のwhile文のif文の位置を変えると無限ループに入りますが、原因がわかりません。どなたか原因のわかる方お願いいたします。
ループ文について
Re: ループ文について
これは 当たり前ですよね。
aに正の数を代入し といいながら 1 は 条件 while(a!=1){ ではじかれる。
したがって 終了条件は ”aが偶数なら2でわってaに代入する” 直前が 2 のときである。
しかし if の順 を逆にすると 折角 1 になったのに 1は奇数だから 4になり
4->2->1ー>4->2->1 の 無限ループになる。
( aが奇数の場合3かけて1たしたものを改めてaに代入し は奇数を 偶数化 するだけ )
aに正の数を代入し といいながら 1 は 条件 while(a!=1){ ではじかれる。
したがって 終了条件は ”aが偶数なら2でわってaに代入する” 直前が 2 のときである。
しかし if の順 を逆にすると 折角 1 になったのに 1は奇数だから 4になり
4->2->1ー>4->2->1 の 無限ループになる。
( aが奇数の場合3かけて1たしたものを改めてaに代入し は奇数を 偶数化 するだけ )
Re: ループ文について
作りたいプログラムは、
ところが、元のプログラムの if(a%2==0){ の a は
最初の if(a%2==1){ の a と同じものではありません。
a=a*3+1; で変更された結果の a である場合があります。
つまり、 となっています。
正しくするには、次のように else を使わないといけません。
最初の if(a%2==1){ の a と同じものではありません。
a=a*3+1; で変更された結果の a である場合があります。
つまり、 となっています。
正しくするには、次のように else を使わないといけません。
Re: ループ文について
君の頭の中では
だったんだろうが
実際には
だからね。
フローチャートを思い浮かべるといいすよ。
何千行、何万行と書くとつまらないことに引っかかて何日もロスるよね!(^^;
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);
}
}
フローチャートを思い浮かべるといいすよ。
何千行、何万行と書くとつまらないことに引っかかて何日もロスるよね!(^^;