我刚开始学习 Go,并使用该ProbablyPrime库编写了一个主要的测试程序。package mainimport ( "fmt" "math/big" "math" "os" "strconv")func prime_test(n int64, certainty int)(bool,float64){ var probobility float64 i := big.NewInt(n) isPrime := i.ProbablyPrime(certainty) probobility = 1 - 1/math.Pow(4,10) return isPrime, probobility}func why_not_prime(n int64)(int64){ var i int64 for i=2 ; i<n/2; i++ { if n%i == 0 {return i} } return i}func main() { var n int64 var certainty int var isPrime bool var probobility float64 if len(os.Args) > 1 { n,_ = strconv.ParseInt(os.Args[1],64,64) certainty,_ = strconv.Atoi(os.Args[2]) } isPrime, probobility = prime_test(n,certainty) if isPrime { fmt.Printf("%d is probably %0.8f%% a prime.", n, probobility*100) } else { var i int64 i = why_not_prime(n) fmt.Printf("%d is a composite because it can be divided by %d", n, i) }}代码可以成功编译。当我运行它时,它总是返回0 is a composite because it can be divided by 2。我猜命令行参数解析有问题。如何解决?
1 回答
眼眸繁星
TA贡献1873条经验 获得超9个赞
问题出在这一行:
n,_ = strconv.ParseInt(os.Args[1],64,64)
国家的文件ParseInt(s string, base int, bitSize int) (i int64, err error):
ParseInt 解释给定基数(2 到 36)中的字符串 s 并返回相应的值 i。
基地最多可以36和你通过64。在这种情况下,将返回一个错误(您可以使用空白标识符将其丢弃_),并且n将具有零值,0因此您将看到输出为
0是合数,因为它可以被 2 整除
解决方案:
将有问题的行更改为:
n, _ = strconv.ParseInt(os.Args[1], 10, 64)
它应该工作。此外,您不应该丢弃错误,因为您会遇到这样的情况。而是像这样正确处理它们:
var err error
n, err = strconv.ParseInt(os.Args[1], 10, 64)
if err != nil {
log.Fatal(err)
}
笔记:
另请注意,第一个参数(os.Args[0]是可执行文件的名称),并且由于您期望并使用 2 个额外参数,因此您应该检查的长度os.Args是否大于 2 而不是 1:
if len(os.Args) > 2 {
// os.Args[1] and os.Args[2] is valid
}
- 1 回答
- 0 关注
- 195 浏览
添加回答
举报
0/150
提交
取消