我正在研究Project Euler問題以適應Go。問題不在於歐拉項目,而是在這個問題中有項目歐拉特定的代碼,可能會帶來一個問題的挑戰。 「尾翼警報」或其他,但現在你知道。這是我的文件結構:從外部文件導入時功能不正常,但在同一文件中正常工作?
+ 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:
package main
import (
"fmt"
"util"
)
func main() {
fmt.Println(util.SumOfDivisors(12))
}
我有我的GOPATH
設置爲/Project Euler/Go
和它建立,當我打電話0運行看似細。 「看起來很好」意味着沒有錯誤,警告,除我的代碼外沒有任何輸出。
什麼是打印到屏幕是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。什麼可能導致這種行爲?該功能在本地正常工作,但在移動到已導入的外部文件時無法正常工作,爲什麼不能在該外部文件上打印任何內容?所有這一切,而建設很好。
我無法重複在Windows上運行Go 1.2的這個問題。也許這是一個錯誤? – 2015-04-01 22:51:49
我發現我需要做些什麼來解決這個問題,但我仍然在爲解釋是什麼造成的。我不知道是什麼導致'util.a'被緩存。 – 2015-04-01 22:55:48