我正在研究 Project Euler 问题以适应 Go。问题不是关于 Project Euler,而是在这个问题中有 Project Euler 特定的代码,可能会泄露问题的挑战。“剧透警报”或其他什么,但现在你知道了。这是我的文件结构:
+ Project Euler
+-+ Go <= GOPATH set here
+-+ src
+-+ util
| +- util.go
|
+- 001.go
+- 002.go
...
+- 023.go
对于问题 23,我SumOfDivisors向 util.go(一个包含多个问题使用的各种方法的文件)添加了一个新函数:
func GetPrimeFactors(val int) map[int]int {
primes := map[int]int{}
init := val
num := 2
for val > 1 {
if (val % num) == 0 {
if num == init {
return nil
}
_, e := primes[num]
if e {
primes[num]++
} else {
primes[num] = 1
}
val /= num
} else {
num++
}
}
return primes
}
func SumOfDivisors(val int) int {
primes := GetPrimeFactors(val)
if primes == nil {
if val == 0 {
return 0
} else {
return 1
}
}
total := 1
for k, v := range primes {
if v > 1 {
n := int((math.Pow(float64(k), float64(v+1)) - 1) / float64(k-1))
total *= n
} else {
n := k + 1
total *= n
}
}
return total - val
}
为了测试这个方法,我在023.go里面写了这个基本的Go:
package main
import (
"fmt"
"util"
)
func main() {
fmt.Println(util.SumOfDivisors(12))
}
我有我的GOPATH设置,/Project Euler/Go当我调用go run 023.go. “看起来很好”意味着除了我的代码之外没有错误、警告和输出。
打印到屏幕的时间是1应该的16。我不认为这是一个逻辑问题,因为当我将函数从 util.go 复制到 023.go(并将对 GetPrimeFactors 的调用修复为 util.GetPrimeFactors)时,该函数运行得很好并像它应该的那样打印 16 . 我试过添加fmt.Println("TEST"),util.SumOfDivisors但它不会打印出这些语句,我也没有收到错误或其他任何信息。如果我将函数的名称更改util.go为其他任何名称,即使主函数023.go没有更改,它仍然会构建并运行输出1. 行为真的很奇怪。
我的 util.go 文件中的其他函数似乎被调用得很好。
我正在运行 Go 1.4.2。什么可能导致这种行为?该功能在本地正常工作,但在移动到导入的外部文件时无法正常工作,为什么该外部文件无法将任何内容打印到屏幕上?所有这一切同时构建得很好。
潇潇雨雨
函数式编程
相关分类