2017-08-03 38 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的原始代碼一樣。