dongyan7851 2014-11-12 09:54
浏览 42
已采纳

移植Euler 8号项目

I am trying to learn Go, and I decided to use Project Euler to help me. I have previously solved some of the problems in Javascript. I am trying to port #8 to Go.

Here it is in Javascript

var n = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";

// Split our input into an array
n = n.split("");

// Loop through every 13 length chuck multiplying them. Keep track of the largest
var largest = 0;
for (var i = 0; i < (n.length - 12); i++) {
    var b = n.slice(i, i + 13);
    var product = b.reduce(function(prev, current) {
        return prev * Number(current);
    }, 1);
    if (product > largest) {
        largest = product;
    }
}
console.log(largest);

And here is my port in Go

import (
    "fmt"
    "strconv"
    "strings"
)

var data string = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"

func main() {
    // Get an array of ints
    var grid []int
    var stringGrid []string = strings.Split(data, "")
    for i := 0; i < 1000; i++ {
        cell, _ := strconv.Atoi(stringGrid[i])
        grid = append(grid, cell)
    }

    // Find the largest one
    largest := 0
    for i := 0; i < len(grid)-12; i++ {
        a := grid[i : i+13]
        total := 1
        for b := 0; b < len(a); b++ {
            total *= a[b]
        }
        if total > largest {
            largest = total
        }
    }
    fmt.Println(largest)
}

I can't find out what is wrong, if I add a bunch of prints to both of them, the spit out the same sequences of numbers, but the Go one doesn't seem to be doing the multiplication right?!? I double checked by hand. There must be some small thing I am missing?

展开全部

  • 写回答

1条回答 默认 最新

  • duanchuanqu593743 2014-11-12 10:07
    关注

    You're running into integer overflow. All javascript numbers are 64-bit doubles, and therefore have 53 bits of integer precision. In Go, the int type is either 32-bit or 64-bit depending on your processor. For you, int is 32 bit, so it cannot store a number as large as the solution. You can specify what size integers to use by using the int32 and int64 types. Below is the corrected program. See here for more info on integer overflow. here for the relevant section in the Go specification.

    package main
    
    import (
        "fmt"
        "strconv"
        "strings"
    )
    
    var data string = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"
    
    func main() {
        // Get an array of ints
        var grid []int64
        var stringGrid = strings.Split(data, "")
        for i := 0; i < 1000; i++ {
            cell, _ := strconv.Atoi(stringGrid[i])
            grid = append(grid, int64(cell))
        }
    
        // Find the largest one
        var largest int64
        for i := 0; i < len(grid)-12; i++ {
            a := grid[i : i+13]
            var total int64 = 1
            for b := 0; b < len(a); b++ {
                total *= a[b]
            }
            if total > largest {
                largest = total
            }
        }
        fmt.Println(largest)
    }
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部