3

私はプロジェクトオイラーの問題を解決しています 16、論理的に解決できるコードになりましたが、オーバーフローか何かだと思うので処理できませんか? int の代わりに int64 を試しましたが、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)
}
4

3 に答える 3

8

この問題へのアプローチには、サイズが 1000 ビットまでの正確な整数演算が必要です。しかし、あなたintは32ビットまたは64ビットを使用しています。math/big.Intはそのようなタスクを処理できます。big.Int私はあなたの目標が自分でそれを行うことによって学ぶことであると想定しているため、意図的に既製のソリューションを提供しません.これはプロジェクトオイラーの意図であると私は信じています.

于 2013-04-23T08:59:54.383 に答える
1

を使用する必要はありませんmath/big。以下は、ヒントとして 10 進数を 2 倍にする男子生徒の数学の方法です。

xs10 進数を最下位から順に保持します。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)
    }
}
于 2013-04-24T19:17:25.173 に答える
1

@jnml で指摘されているように、ints は十分な大きさではありません。Go で 2^1000 を計算したい場合は、big.Ints が適しています。関数をsに変換するよりも使いやすいExp()math/bigメソッドを提供することに注意してください。powerbig.Int

私は約 1 年前に Project Euler の問題に取り組み、言語を理解するために Go でそれらを実行しました。私は s を必要とするものは好きbig.Intではありませんでした。これは Go での作業がそれほど簡単ではありませんでした。これについては、Ruby の 1 行で「ごまかして」実行しました。

別の言語であっても、有効なソリューションを表示するのは悪い形式と見なされていたことを思い出したため、削除されました。

big.Intとにかく、私の Ruby の例は、私が Go のsで学んだもう 1 つのことを示しています。それらを文字列に変換してその文字列を操作する方が、big.Intそれ自体を操作するよりも簡単な場合があります。この問題は、それらのケースの 1 つとして私を襲います。

Ruby アルゴリズムを Go に変換すると、big.Ints を 1 行で処理するだけで、文字列を処理して数行のコードで簡単に答えを得ることができます。

于 2013-04-23T18:38:22.740 に答える