我正在解决Project Euler problem 16,我最终得到的代码可以在逻辑上解决它,但是无法处理,因为我相信它的溢出或什么?我尝试使用int64代替int,但它只打印0,0。如果我将功率更改为30以下的任何功能都可以,但是30以上它不起作用,任何人都可以指出我的错误吗?我相信它无法计算2 ^ 1000。
// PE_16 project main.go
package main
import (
"fmt"
)
func power(x, y int) int {
var pow int
var final int
final = 1
for pow = 1; pow <= y; pow++ {
final = final * x
}
return final
}
func main() {
var stp int
var sumfdigits int
var u, t, h, th, tth, l int
stp = power(2,1000)
fmt.Println(stp)
u = stp / 1 % 10
t = stp / 10 % 10
h = stp / 100 % 10
th = stp / 1000 % 10
tth = stp / 10000 % 10
l = stp / 100000 % 10
sumfdigits = u + t + h + th + tth + l
fmt.Println(sumfdigits)
}
答案 0 :(得分:8)
您解决此问题的方法需要精确的整数数学,最大为1000位。但是你使用的是32位或64位的int
。 math/big.Int可以处理此类任务。我故意不使用big.Int
提供现成的解决方案,因为我认为你的目标是自己学习,我认为这是Project Euler的意图。
答案 1 :(得分:1)
如@jnml所述,int
s不够大;如果你想在Go中计算2 ^ 1000,big.Int
s在这里是一个不错的选择。请注意,math/big
提供的Exp()方法比将power
函数转换为big.Int
更容易使用。
我在大约一年前解决了一些Project Euler问题,在Go中做了一些以了解语言。我不喜欢需要big.Int
的那些,这在Go中并不那么容易使用。对于这个,我“欺骗”并在Ruby的一行中做到了:
已删除,因为我记得即使使用其他语言,显示工作解决方案也被视为不良格式。
无论如何,我的Ruby示例显示了我使用Go的big.Int
s学到的另一件事:有时convert them to a string使用该字符串比使用big.Int
本身更容易。作为其中一个案例,这个问题让我感到震惊。
将我的Ruby算法转换为Go,我只在一行上使用big.Int
,然后使用字符串很容易,只用几行代码就可以得到答案。
答案 2 :(得分:1)
您不需要使用math/big
。以下是学校男生数学方法,将十进制数加倍作为提示!
xs
保存最低有效第一顺序的十进制数字。传入指向数字(pxs
)的指针,因为切片可能需要变大。
func double(pxs *[]int) {
xs := *pxs
carry := 0
for i, x := range xs {
n := x*2 + carry
if n >= 10 {
carry = 1
n -= 10
} else {
carry = 0
}
xs[i] = n
}
if carry != 0 {
*pxs = append(xs, carry)
}
}