项目欧拉16 - 帮助解决它

时间:2013-04-23 08:50:06

标签: go

我正在解决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)
}

3 个答案:

答案 0 :(得分:8)

您解决此问题的方法需要精确的整数数学,最大为1000位。但是你使用的是32位或64位的intmath/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)
    }
}