素数程序给出了错误的答案

时间:2016-10-10 02:46:33

标签: go

我最近创建了一个程序,它会告诉你一个数字是否为素数。它得到的所有答案都是正确的但是9的素数。

package main

import "fmt"

func isPrime(num int) bool {
    for x := 2; x > 1; x++ {
        if num%2 == 0 {
            return false
        } else {
            return true
        }
    }
    return true
}

func main() {
    fmt.Printf("is it a prime number: %v \n", isPrime(9))
}

有什么问题?
提前谢谢!

3 个答案:

答案 0 :(得分:0)

实际上,您的代码只检查一个数字的奇偶校验,如果是偶数则返回false。我实际上并不知道Go,但我确实设法使用以下代码解决了这个问题:

func isPrime(num int) bool {
    for x := 2; x < num; x++{
        if num%x == 0 && num!=2{
            return false
        }
    }return true;
}

答案 1 :(得分:0)

根据prime number definition 素数(或素数)是一个大于1的自然数,除了1和之外没有正除数,在你的代码中你只是检查它是否奇数

我在Go https://play.golang.org/p/2XXTUFbjhy中给你一个快速的解决方案。它只会直到数字的平方根。

def transform_directoy(input_directory, output_directory):    
    import codecs, glob, os
    from tika import parser
    all_texts = []
    for filename in sorted(glob.glob(os.path.join(input_directory, '*.pdf'))):
        parsed = parser.from_file(filename)
        texts = parsed['content']
        all_texts.append(texts)

    for i , a_list in enumerate(all_texts):
        new_dir_path = output_directory


        #print(new_dir_path)
        path = os.path.join(new_dir_path, "list%d.txt" % i)
        with codecs.open(path, "w", encoding='utf8') as filename:
            for item in [a_list]:
                filename.write(item+"\n")        

另外,如果您有兴趣以更快的方式知道数字是否为引物,我建议您阅读Sieve of Eratosthenes

答案 2 :(得分:0)

1-以下是您的代码的工作版本:在The Go Playground上尝试。

package main

import "fmt"

func isPrime(num int) bool {
    if num < 2 {
        return false
    }
    for x := 2; x < num; x++ {
        if num%x == 0 {
            return false
        }
    }
    return true
}

func main() {
    fmt.Printf("is it a prime number: %v \n", isPrime(9))
}

2-唯一偶数素数是2,所以最好先检查它:

if n == 2 {
    return true
}

然后没有其他偶数素数:全部删除它们,并且没有少于2的素数:

if n < 2 || n&1 == 0 {
    return false
}

并且您不需要检查n的平方根:

sqrt := int(math.Sqrt(float64(n)))

现在你可以从3开始,只有奇数(i += 2):

for i := 3; i <= sqrt; i += 2 {
    if n%i == 0 {
        return false
    }
}

The Go Playground上试用:

package main

import (
    "fmt"
    "math"
)

func isPrime(n int) bool {
    if n == 2 {
        return true
    }
    if n < 2 || n&1 == 0 {
        return false
    }
    sqrt := int(math.Sqrt(float64(n)))
    for i := 3; i <= sqrt; i += 2 {
        if n%i == 0 {
            return false
        }
    }
    return true
}

func main() {
    fmt.Printf("is it a prime number: %v \n", isPrime(9))
    for i := 0; i < 120; i++ {
        if isPrime(i) {
            fmt.Print(i, " ")
        }
    }
    fmt.Println()
}

输出:

is it a prime number: false 
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113

请参阅:
Prime number
Generating primes

enter image description here