将 Project Euler #8 移植到 Go

我正在努力学习 Go,我决定使用 Project Euler 来帮助我。

我正在尝试将 #8 移植到 Go。


这是在 Javascript 中


// 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);

这是我在 Go 中的端口


import (

    "fmt"

    "strconv"

    "strings"

)


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)

}

我不知道出了什么问题,如果我给它们加上一堆打印,就会吐出相同的数字序列,但是 Go 似乎没有在做乘法,对吧?!?我手动检查了一遍。一定是我遗漏了一些小东西吗?


素胚勾勒不出你
浏览 176回答 1
1回答

蓝山帝景

你遇到了整数溢出。所有 javascript 数字都是 64 位双精度数,因此具有 53 位整数精度。在 Go 中,int类型为 32 位或 64 位,具体取决于您的处理器。对您来说,int是 32 位,因此它无法存储与解决方案一样大的数字。您可以使用int32和int64类型指定要使用的大小整数。下面是修正后的程序。有关整数溢出的更多信息,请参见此处。这里是 Go 规范中的相关部分。package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "strconv"&nbsp; &nbsp; "strings")var data string = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"func main() {&nbsp; &nbsp; // Get an array of ints&nbsp; &nbsp; var grid []int64&nbsp; &nbsp; var stringGrid = strings.Split(data, "")&nbsp; &nbsp; for i := 0; i < 1000; i++ {&nbsp; &nbsp; &nbsp; &nbsp; cell, _ := strconv.Atoi(stringGrid[i])&nbsp; &nbsp; &nbsp; &nbsp; grid = append(grid, int64(cell))&nbsp; &nbsp; }&nbsp; &nbsp; // Find the largest one&nbsp; &nbsp; var largest int64&nbsp; &nbsp; for i := 0; i < len(grid)-12; i++ {&nbsp; &nbsp; &nbsp; &nbsp; a := grid[i : i+13]&nbsp; &nbsp; &nbsp; &nbsp; var total int64 = 1&nbsp; &nbsp; &nbsp; &nbsp; for b := 0; b < len(a); b++ {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; total *= a[b]&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if total > largest {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; largest = total&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; fmt.Println(largest)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go