2017-08-03 43 views
-2

我最初用C编写代码相当简单,它似乎没有bug。我正在努力争取在Python中使用相同的想法,并希望得到一些指导。转换代码以确定从C到Python的素数3

对于Python代码,我尝试不使用cs50库,因此在获取整数时必须采取额外的措施。我发现它总是返回True,即使它表示它不是一个整数,它在输入1和2时不会返回任何内容,并且它将所有数字都修正为15,这表示它是素数。在for循环中肯定有些问题,但是从我对Python for循环的理解中,范围从第一个数字到第二个数字都是非包含的。

这是我的C代码:

#include <stdio.h> 
#include <cs50.h> 

int main(void) 
{ 
    printf("enter a number: "); 
    int prime = get_int(); 

    for (int j = 2; j < prime; j++) 
    { 
     if (prime % j == 0) 
     { 
      printf("%i is not a prime number. \n", prime); 
      return 0; 
     } 

    } 

    printf("%i is a prime number. \n", prime); 
    return 1; 
} 

,这是我的Python代码:

def main(): 
    n = get_number() 
    m = is_prime(n) 

def get_number(): 
    while True: 
     prime = input("enter an integer: ") 
     if prime.isdigit(): 
      prime = int(prime) 
      break 
    while True: 
     if prime >= 1: 
      break 
    return prime 

def is_prime(n): 
    for i in range(2,n): 
     if n % i == 0: 
      print("{} is not a prime number".format(n)) 
      return 1 
     print("{} is a prime number".format(n)) 
     return 0 

if __name__=="__main__": 
    main() 

你能解释一下我做错了吗?

+3

你的第二个'while True:'如果'prime'小于1,'loop将无限次地重复,因为它永远不会更新prime。 – Barmar

+0

你应该迭代到n的平方根。大数字节省时间 –

+0

“是素数”的缩进太深。应该在循环之外。否则无论哪种方式立即返回。 –

回答

1

你需要把这个数字作为循环外部的素数,就像你的C版本一样。

def is_prime(n): 
    for i in range(2,n): 
     if n % i == 0: 
      print("{} is not a prime number".format(n)) 
      return 1 
    print("{} is a prime number".format(n)) 
    return 0 
+0

对n进行测试非常浪费 –

+0

确实如此,但与问题中的问题无关。我也可以完全重写它来使用Eratosthenes的Sieve,但那不能解释他的错误。 – Barmar

+0

@ Jean-FrançoisFabre上面的评论足以说明这一点。 – Barmar

0

我相信最直接翻译你的Ç码成Python会是这样的:

import sys 

def get_int(message): 

    while True: 
     string = input(message) 

     if string.isdigit(): 
      integer = int(string) 
      if integer >= 1: 
       return integer 

def main(): 

    prime = get_int("enter a number: ") 

    for j in range(2, prime): 
     if prime % j == 0: 
      print("{} is not a prime number".format(prime)) 
      sys.exit(1) # failure 

    print("{} is a prime number.".format(prime)) 
    sys.exit(0) # success 

if __name__ == "__main__": 
    main() 

此代码是越野车(索赔1是一个素数),效率低下,就像原版的。

用法

> bash 
bash-3.2$ python3 test.py 
enter a number: 13 
13 is a prime number. 
bash-3.2$ echo $? 
0 
bash-3.2$ python3 test.py 
enter a number: 55 
55 is not a prime number 
bash-3.2$ echo $? 
1 
bash-3.2$ 

尽管这两条线:

print("{} is not a prime number".format(prime)) 
sys.exit(1) # failure 

可以组合成一个:

sys.exit("{} is not a prime number".format(prime)) 

我们不想对这一计划做因为该信息将打印到stderr,但在我们的ot她的出口不能合并:

print("{} is a prime number.".format(prime)) 
sys.exit(0) # success 

消息打印到stdout。所以为了保持一致性,我使它们都相同,打印到stdout,就像OP的原始代码一样。