我正在尝试在 golang 中解决项目euler问题 3:问题如下:13195 的质因数是 5、7、13 和 29。数 600851475143 的最大质因数是多少?我试图解决它如下: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-- } }}在函数 'primeset' 中,我从一个名为 'primes' 的无符号整数开始,初始值为 0,然后左移一个数字(它是一个复合数)并将 'primes' 的那个位设置为 1。这个想法是我只需检查“素数”的第 4 位,看看它是否已设置。如果该位已设置,则它不是质数。对于小数字,代码似乎可以工作,但是当我开始测试诸如 100 之类的数字时,突然之间事情变得相当奇怪。我注意到在尝试将其设置为第 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有人可以指出我执行位操作的方式可能有什么问题吗?
1 回答
RISEBY
TA贡献1856条经验 获得超5个赞
<< left shift integer << unsigned integer >> right shift integer >> unsigned integer移位运算符将左操作数移位右操作数指定的移位计数。如果左操作数是有符号整数,则它们实现算术移位,如果它是无符号整数,则它们实现逻辑移位。班次计数没有上限。移位的行为就像左操作数被移位 n 次,移位计数为 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 关注
- 173 浏览
添加回答
举报
0/150
提交
取消