未为数字 golang 设置位

我正在尝试在 golang 中解决项目euler问题 3:


问题如下:


13195 的质因数是 5、7、13 和 29。数 600851475143 的最大质因数是多少?


我试图解决它如下:


package main


import (

    "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: 48

Bitset value is: 375299968947536

Current num: 50

Bitset value is: 1501199875790160

Current num: 52

Bitset value is: 6004799503160656

Current num: 54

Bitset value is: 24019198012642640

Current num: 56

Bitset value is: 96076792050570576

Current num: 58

Bitset value is: 384307168202282320

Current num: 60

Bitset value is: 1537228672809129296

Current num: 62

Bitset value is: 6148914691236517200

Current num: 64

Bitset value is: 6148914691236517200

Current num: 66

Bitset value is: 6148914691236517200

Current num: 68

Bitset value is: 6148914691236517200

Current num: 70

Bitset value is: 6148914691236517200

Current num: 72

Bitset value is: 6148914691236517200

Current num: 74

Bitset value is: 6148914691236517200

Current num: 76

Bitset value is: 6148914691236517200

Current num: 78

有人可以指出我执行位操作的方式可能有什么问题吗?


大话西游666
浏览 174回答 1
1回答

RISEBY

Go 编程语言规范算术运算符<<&nbsp;&nbsp;&nbsp;left&nbsp;shift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;integer&nbsp;<<&nbsp;unsigned&nbsp;integer >>&nbsp;&nbsp;&nbsp;right&nbsp;shift&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;integer&nbsp;>>&nbsp;unsigned&nbsp;integer移位运算符将左操作数移位右操作数指定的移位计数。如果左操作数是有符号整数,则它们实现算术移位,如果它是无符号整数,则它们实现逻辑移位。班次计数没有上限。移位的行为就像左操作数被移位 n 次,移位计数为 n。您正在从 64 位的末尾移出位:(1<<p)where p > 63。例如,package mainimport (&nbsp; &nbsp; "fmt")func main() {&nbsp; &nbsp; primes := ^uint64(0)&nbsp; &nbsp; fmt.Println(primes)&nbsp; &nbsp; for _, p := range []uint64{0, 1, 2, 62, 63, 64, 65, 99, 100} {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(p, "\t", primes&(1<<p))&nbsp; &nbsp; }}输出:184467440737095516150&nbsp; &nbsp; 11&nbsp; &nbsp; 22&nbsp; &nbsp; 462&nbsp; &nbsp;461168601842738790463&nbsp; &nbsp;922337203685477580864&nbsp; &nbsp;065&nbsp; &nbsp;099&nbsp; &nbsp;0100&nbsp; 0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go