当初の公開:
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)
}
}
}
アイデアは非常に重要です。この記事の内容は非常に単純なので、詳細に立ち入る必要はありません。
金曜日、早めに休憩してください。