我正在嘗試在 golang 中解決項目euler問題 3:問題如下:13195 的質(zhì)因數(shù)是 5、7、13 和 29。數(shù) 600851475143 的最大質(zhì)因數(shù)是多少?我試圖解決它如下:package mainimport ( "fmt")func primeset(n uint64) uint64 { primes := uint64(0) for p:= uint64(2);p <= n;p++ { if((primes & (1 << p)) == 0){ fmt.Println("Current prime",p) for j:=uint64(2)*p;j <=n;j=j+p { fmt.Println("Current num:",j) primes |= (1 << j) fmt.Println("Bitset value is:",primes) } } } return primes}func main() { n := uint64(100) primes := primeset(n) fmt.Println("Primes is",primes) j := n for j >= 2 { s := primes & (1 << uint64(j)) if((s == 0) && ((n % j) == 0)){ fmt.Println("Largest factor",j) return } else { j-- } }}在函數(shù) 'primeset' 中,我從一個名為 'primes' 的無符號整數(shù)開始,初始值為 0,然后左移一個數(shù)字(它是一個復(fù)合數(shù))并將 'primes' 的那個位設(shè)置為 1。這個想法是我只需檢查“素數(shù)”的第 4 位,看看它是否已設(shè)置。如果該位已設(shè)置,則它不是質(zhì)數(shù)。對于小數(shù)字,代碼似乎可以工作,但是當(dāng)我開始測試諸如 100 之類的數(shù)字時,突然之間事情變得相當(dāng)奇怪。我注意到在嘗試將其設(shè)置為第 62 位時,位移位不起作用。以下跟蹤可以演示這種情況:Current num: 48Bitset value is: 375299968947536Current num: 50Bitset value is: 1501199875790160Current num: 52Bitset value is: 6004799503160656Current num: 54Bitset value is: 24019198012642640Current num: 56Bitset value is: 96076792050570576Current num: 58Bitset value is: 384307168202282320Current num: 60Bitset value is: 1537228672809129296Current num: 62Bitset value is: 6148914691236517200Current num: 64Bitset value is: 6148914691236517200Current num: 66Bitset value is: 6148914691236517200Current num: 68Bitset value is: 6148914691236517200Current num: 70Bitset value is: 6148914691236517200Current num: 72Bitset value is: 6148914691236517200Current num: 74Bitset value is: 6148914691236517200Current num: 76Bitset value is: 6148914691236517200Current num: 78有人可以指出我執(zhí)行位操作的方式可能有什么問題嗎?
1 回答

RISEBY
TA貢獻1856條經(jīng)驗 獲得超5個贊
<< left shift integer << unsigned integer >> right shift integer >> unsigned integer移位運算符將左操作數(shù)移位右操作數(shù)指定的移位計數(shù)。如果左操作數(shù)是有符號整數(shù),則它們實現(xiàn)算術(shù)移位,如果它是無符號整數(shù),則它們實現(xiàn)邏輯移位。班次計數(shù)沒有上限。移位的行為就像左操作數(shù)被移位 n 次,移位計數(shù)為 n。
您正在從 64 位的末尾移出位:(1<<p)where p > 63。例如,
package main
import (
"fmt"
)
func main() {
primes := ^uint64(0)
fmt.Println(primes)
for _, p := range []uint64{0, 1, 2, 62, 63, 64, 65, 99, 100} {
fmt.Println(p, "\t", primes&(1<<p))
}
}
輸出:
18446744073709551615
0 1
1 2
2 4
62 4611686018427387904
63 9223372036854775808
64 0
65 0
99 0
100 0
- 1 回答
- 0 關(guān)注
- 200 瀏覽
添加回答
舉報
0/150
提交
取消