dongyan7851
2014-11-12 17: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 18: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)
    }
    
    点赞 评论

相关推荐 更多相似问题