面接の質問:裁判官2 ^ n、3 ^ n、4 ^ n、5 ^ n

      当初の公開:

 

    F社の面接の質問は次のとおりです。正の整数が2のn乗、3のn乗、4のn乗、5のn乗かどうかを判断するにはどうすればよいですか。ここで、nは負でない整数です。要件:4つの異なるアルゴリズムを使用します。

 

2のn乗

     2のn乗の判断は比較的一般的な問題です。2のn乗バイナリに1が1つしかないことは簡単にわかります。したがって、次のアイデアを使用して判断できます。


package main

import "fmt"

func is2Pow(n uint32) bool {
    if n == 0 {
        return false
    }
    
    if n & (n - 1) == 0 {
        return true
    }
    
    return false
}

func main() {
    for i := uint32(0); i < 100; i++ {
        if is2Pow(i) {
            fmt.Println(i)
        }
    }
}

      

3のn乗

     3は素数であるため、最初に32ビットの正の整数で3のn乗の最大値を見つけることができます。次に、次のように、考え方は非常に自然です。

package main

import "fmt"

func is3Pow(n uint32) bool {
    if n == 0 {
        return false
    }
    
    if 3486784401 % n == 0 {
        return true
    }
    
    return false
}

func main() {
    for i := uint32(0); i < 100; i++ {
        if is3Pow(i) {
            fmt.Println(i)
        }
    }
}

 

4のn乗

     4のn乗は最初に2のn乗である必要があり、4 ^ n =(3 + 1)^ nです。二項定理によれば、4 ^ n%3 = 1であるため、アルゴリズムコードは次のようになります。次のように:     

package main

import "fmt"

func is4Pow(n uint32) bool {
    if n == 0 {
        return false
    }
    
    if n & (n - 1) != 0 {
        return false
    }
    
    if n % 3 == 1 {
        return true
    }
    
    return false
}

func main() {
    for i := uint32(0); i < 100; i++ {
        if is4Pow(i) {
            fmt.Println(i)
        }
    }
}

 

5のn乗

      以前の方法が使用されたので、一般的な方法の使用を検討できます。


package main

import "fmt"

func is5Pow(n uint32) bool {
    if n == 0 {
        return false
    }
  
  if n == 1 {
  return true
  }
    
  for {
    if n % 5 != 0 {
      return false
    }

    n = n / 5
    if n < 5 {
      break
    }
  }

  if n == 1 {
    return true
  }

  return false
}

func main() {
    for i := uint32(0); i < 100; i++ {
        if is5Pow(i) {
            fmt.Println(i)
        }
    }
}

 

      アイデアは非常に重要です。この記事の内容は非常に単純なので、詳細に立ち入る必要はありません。

      金曜日、早めに休憩してください。

おすすめ

転載: blog.csdn.net/stpeace/article/details/108921546