Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

2^nの判定--ぱぱっと書かせるプログラムの問題

ネタ元 →ぱぱっと書かせるプログラムの問題

出題条件を早とちりして、勝手にハマってしまった私が居ます...orz:
    n=0  => TRUE
    n=1  => False と誤認してしまって、投稿してました。

みなさんのエレガントさには及びませんが、再掲載
   '========仕様誤読によるダメ版
    Private Function is2累乗(ByVal n As Long) As Boolean
        If n = 0 Then Return True
        Static nest As Integer = 0
        Dim rc As Boolean = False
        Try
            nest += 1
            If nest = 1 AndAlso n = 1 Then Return False
            If nest > 1 AndAlso n = 1 Then Return True
            If n Mod 2 = 1 Then Return False
            If n = 1 AndAlso n Mod 2 = 0 Then Return True
            Return is2累乗(n \ 2)
        Catch ex As Exception
        Finally
            nest -= 1
        End Try
        Return rc
    End Function

n=1 の時の処理を Falseにしたいが為に、 再帰レベルを捕捉して、再帰解消判定と兼ねさせました。泥臭くなって....(^^

良く確認したら 2^n なんで、 1はTrueで 0はFalse です。
    Private Function is2累乗_新(ByVal n As Long) As Boolean
        If n = 0 Then Return False
        If n = 1 Then Return True
        If n Mod 2 = 1 Then Return False
        Return is2累乗_新(n \ 2)
    End Function

これで、いいやん、何を自分で墓穴をほったのだろう...orz;

再帰の教育用テーマにいいですね。

いやぁ、パパッと作ると、完成度が低くなるという実例でした <--  オイ!!
ふと....2^(-n)の判定はできるのだろうか、0.125 はスッキリだが、 0.124は半端なであるのをアプリ自身が認識できるのかなぁ..

 

 

 

投稿日時 : 2008年7月18日 13:18

Feedback

# re: 2^nの判定--ぱぱっと書かせるプログラムの問題 2008/07/18 22:19 Pasie.

ぱぱっと作ってみました…

Function isAPo2(ByVal num As Integer) As Integer
 If (num < 0) Then Throw New System.Exception("自然数じゃないといやん")
 If (num = 0) Then Return False

 Dim e1 As Double = System.Math.Log(num) / System.Math.Log(2)
 Dim e2 As Double = Int(e1)

 Return e1 = e2
End Function

邪道だって言われそうだなあ(間違えてたら済まぬ)
#今日はえくせれんとなロジックは考えられない日です…

# re: 2^nの判定--ぱぱっと書かせるプログラムの問題 2008/07/19 1:25 Ognac

log(num)/log(2) .....盲点.....その手がありますね。

タイトル
名前
Url
コメント