大图书馆围棋中的 Lychrel Numbers
Lychrel Numbers in Go with the big Library
我正在尝试用 Go 编写 Lychrel 数字程序,但 运行 遇到了一些麻烦。使用 "math/big" 库,并使用一些额外的打印语句进行调试,我的代码如下所示:
func reverse(n *big.Int) *big.Int {
var (
m = n
r = big.NewInt(0)
z = big.NewInt(0)
one = big.NewInt(1)
ten = big.NewInt(10)
)
for {
r.Mul(r, ten)
d := z
d.Mod(m, ten)
r.Add(r, d)
m.Div(m, ten)
if m.Cmp(one) == -1 {
return r
}
}
}
func radd(num *big.Int) *big.Int {
newNum := num
rnum := reverse(num)
newNum = newNum.Add(num, rnum)
fmt.Println(num, "+", rnum, "=", newNum)
return newNum
}
func lychrel(arg int) bool {
fmt.Println("Now testing", arg)
num := big.NewInt(int64(arg))
for i := 0; i < 50; i++ {
num = radd(num)
fmt.Println(i, ":", num)
if num.Cmp(reverse(num)) == 0 {
return false
}
}
return true
}
虽然没有大库的类似代码工作正常(除了最终的溢出错误),但这个版本没有。例如,当我执行 lychrel(196) 时,我得到
Now testing 196
691 + 691 = 691
0 : 691
0 + 0 = 0
1 : 0
我不知道哪里出了问题。我希望我没有遗漏一些愚蠢的东西,因为我花了整个早上的时间来尝试让它工作。
import "math/big"
func NewInt(x int64) *Int
NewInt allocates and returns a new Int set to x.
func (z *Int) Set(x *Int) *Int
Set sets z to x and returns z.
您分配的是指针,而不是值。
m = n
newNum := num
赋值,
m = new(big.Int).Set(n)
newNum := new(big.Int).Set(num)
例如,
package main
import (
"fmt"
"math/big"
)
func reverse(n *big.Int) *big.Int {
var (
m = new(big.Int).Set(n)
r = big.NewInt(0)
z = big.NewInt(0)
one = big.NewInt(1)
ten = big.NewInt(10)
)
for {
r.Mul(r, ten)
d := z
d.Mod(m, ten)
r.Add(r, d)
m.Div(m, ten)
if m.Cmp(one) == -1 {
return r
}
}
}
func radd(num *big.Int) *big.Int {
newNum := new(big.Int).Set(num)
rnum := reverse(num)
newNum = newNum.Add(num, rnum)
fmt.Println(num, "+", rnum, "=", newNum)
return newNum
}
func lychrel(arg int) bool {
fmt.Println("Now testing", arg)
num := big.NewInt(int64(arg))
for i := 0; i < 50; i++ {
num = radd(num)
fmt.Println(i, ":", num)
if num.Cmp(reverse(num)) == 0 {
return false
}
}
return true
}
func main() {
lychrel(196)
}
输出:
Now testing 196
196 + 691 = 887
0 : 887
. . .
我正在尝试用 Go 编写 Lychrel 数字程序,但 运行 遇到了一些麻烦。使用 "math/big" 库,并使用一些额外的打印语句进行调试,我的代码如下所示:
func reverse(n *big.Int) *big.Int {
var (
m = n
r = big.NewInt(0)
z = big.NewInt(0)
one = big.NewInt(1)
ten = big.NewInt(10)
)
for {
r.Mul(r, ten)
d := z
d.Mod(m, ten)
r.Add(r, d)
m.Div(m, ten)
if m.Cmp(one) == -1 {
return r
}
}
}
func radd(num *big.Int) *big.Int {
newNum := num
rnum := reverse(num)
newNum = newNum.Add(num, rnum)
fmt.Println(num, "+", rnum, "=", newNum)
return newNum
}
func lychrel(arg int) bool {
fmt.Println("Now testing", arg)
num := big.NewInt(int64(arg))
for i := 0; i < 50; i++ {
num = radd(num)
fmt.Println(i, ":", num)
if num.Cmp(reverse(num)) == 0 {
return false
}
}
return true
}
虽然没有大库的类似代码工作正常(除了最终的溢出错误),但这个版本没有。例如,当我执行 lychrel(196) 时,我得到
Now testing 196
691 + 691 = 691
0 : 691
0 + 0 = 0
1 : 0
我不知道哪里出了问题。我希望我没有遗漏一些愚蠢的东西,因为我花了整个早上的时间来尝试让它工作。
import "math/big"
func NewInt(x int64) *Int
NewInt allocates and returns a new Int set to x.
func (z *Int) Set(x *Int) *Int
Set sets z to x and returns z.
您分配的是指针,而不是值。
m = n
newNum := num
赋值,
m = new(big.Int).Set(n)
newNum := new(big.Int).Set(num)
例如,
package main
import (
"fmt"
"math/big"
)
func reverse(n *big.Int) *big.Int {
var (
m = new(big.Int).Set(n)
r = big.NewInt(0)
z = big.NewInt(0)
one = big.NewInt(1)
ten = big.NewInt(10)
)
for {
r.Mul(r, ten)
d := z
d.Mod(m, ten)
r.Add(r, d)
m.Div(m, ten)
if m.Cmp(one) == -1 {
return r
}
}
}
func radd(num *big.Int) *big.Int {
newNum := new(big.Int).Set(num)
rnum := reverse(num)
newNum = newNum.Add(num, rnum)
fmt.Println(num, "+", rnum, "=", newNum)
return newNum
}
func lychrel(arg int) bool {
fmt.Println("Now testing", arg)
num := big.NewInt(int64(arg))
for i := 0; i < 50; i++ {
num = radd(num)
fmt.Println(i, ":", num)
if num.Cmp(reverse(num)) == 0 {
return false
}
}
return true
}
func main() {
lychrel(196)
}
输出:
Now testing 196
196 + 691 = 887
0 : 887
. . .