プロが教える店舗&オフィスのセキュリティ対策術

5600を偶数なら2で割り、奇数なら+1を加え偶数にして、それをまた2で割る~・・・ 繰り返すループをwhile を使って簡潔に書きたいのですがよろしくお願いします。 または、どのようなバリエーションがあるのか 教えてください。それと1までいったら止まるようにします。

A 回答 (3件)

>while ? do という形を使っても、おなじようなことができますでしょうか?


以下のようにしてください。
----------------------------
print "input=>"
data = gets
num = data.to_i
while num > 1 do
p num
if num%2 == 0
num = num / 2
else
num = (num + 1) / 2
end
end
p num

----------------------------
実行結果
-------------------------
input=>5600
5600
2800
1400
700
350
175
88
44
22
11
6
3
2
1
---------------------------------
    • good
    • 0
この回答へのお礼

ありがとうござまいす。凄いと思います。感謝します。
大変参考になりました。

お礼日時:2013/06/06 10:48

以下のようにしてください。


-------------------------------
print "input=>"
data = gets
num = data.to_i
while true
p num
break if num <= 1
if num%2 == 0
num = num / 2
else
num = (num + 1) / 2
end
end
--------------------------------
実行結果は以下のとおり。
input=>100
100
50
25
13
7
4
2
1
----------------------------------
尚、whileを使わずに再帰処理で行なう場合は以下のようにします。
----------------------------------------
def shori(num)
p num
return if num <= 1
if num%2 == 0
num = num / 2
else
num = (num + 1) / 2
end
shori(num)
end
print "input=>"
data = gets
shori(data.to_i)
-----------------------------------------

この回答への補足

ありがとうございます。驚きです。参考書よりも参考になります。
while ? do という形を使っても、おなじようなことができますでしょうか? もし差し支えなければ教えてください。よろしくお願いします。

補足日時:2013/06/05 21:37
    • good
    • 0
この回答へのお礼

ありがとうござまいす。とても参考になります。いろいろなやり方があるんですね。

お礼日時:2013/06/06 10:46

偶数を2で割る


処理
奇数なら+1する
処理
(偶数になっているので)2で割る
...

というループなのでしょうか?

偶数だったら2で割る/奇数なら+1して2で割る
処理

というループなのでしょうか?

また、処理の最初は5600なのでしょうか?2で割った2800なのでしょうか?
1で止まるとは、1の処理をして終わるという意味なのか、1の処理はしないで終わるという意味なのか、どちらでしょう?

これらがはっきりしないと、プログラムは作れません。
はっきりしたら、処理と計算とループ判定を、仕様を満すように並べます。


テクニックとしては、
偶数だったら2で割る/奇数なら+1して2で割る
処理
の場合、整数/整数=整数(端数切り捨て)となることを利用して
num = (num+1)/2
と1つの式に書ける、というものくらいです。

この回答への補足

言葉足らずで申しわけありませんでした。とても感謝しています。
偶数だったら2で割り、奇数なら+1して2で割る処理で最終的には、2÷2 で 1になった所で終わるという処理です。その経過を順番に guts 又は print で 5800~ 1 になるまで表示したいのですけど、難しくて分かりませんでした。

補足日時:2013/06/05 19:14
    • good
    • 0
この回答へのお礼

ありがとうござまいす。とても参考になります。

お礼日時:2013/06/06 10:49

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