【问题标题】:Need assistance to improve my prime number calc code python需要帮助来改进我的素数计算代码 python
【发布时间】:2020-02-22 22:04:57
【问题描述】:

这里是python初学者,其实是一个非常初级的编程学生。我有一个任务是编写一个程序来确定输入的数字是否是质数。我粘贴了下面的代码。午夜前到期,所以我已经按原样上交了,但为了我自己,我仍然想改进/学习。我想知道如何在仍然是“while 循环”的同时将其从蛮力方式中取出。我遇到的几个问题是我尝试使用平方根计算,但一切都返回错误。我试过打印“是素数”,否则“不是素数”总是被顶起。我下面的内容确实有效,但它不是“有效的”。无论如何,我感谢任何帮助。

def is_prime():

    inp = input("Enter your number: ")
    if not (inp.isdigit() and float(inp).is_integer() and  float(inp) > 1):
        raise ValueError("Not an integer, try again")

    val = int(inp)
    i = val - 1
    ret = True

    while(i > 1):
        if(val % i == 0):
            ret = False
        i = i -1
    return ret

print(is_prime())

【问题讨论】:

  • 你可以从跳过所有偶数开始
  • 查看eratosthenes算法的筛子en.wikipedia.org/wiki/Sieve_of_Eratosthenes
  • 运行到我的 sqrt 并在你第一次返回 false 时返回
  • @abhilb:这对于查找所有质数到极限是很好的,但是如果您只想检查单个数字的质数,它会做很多不必要的工作。 (尽管如此,它还是值得一试的,即使它是针对这项特定工作的错误工具。)
  • 顺便说一句,您在这里要求的是真正的代码审查,它有一个专门的site,尽管有很多重叠,这是一个非常体面的问题无论是在这种情况下,因为你确实有一个特定的问题。

标签: python primes


【解决方案1】:

你好,这里是一个检查是否是素数的代码示例,方法相对较好:

def isPrime(n) : 

    # Corner cases 
    if (n <= 1) : 
        return False
    if (n <= 3) : 
        return True

    # This is checked so that we can skip  
    # middle five numbers in below loop 
    if (n % 2 == 0 or n % 3 == 0) : 
        return False

    i = 5
    while(i * i <= n) : 
        if (n % i == 0 or n % (i + 2) == 0) : 
            return False
        i = i + 6

    return True


# Driver Program  
if (isPrime(11)) : 
    print(" true") 
else : 
    print(" false") 

if(isPrime(15)) : 
    print(" true") 
else :  
    print(" false") 

我建议你看看这篇文章并检查素数的理论 https://www.geeksforgeeks.org/python-program-to-check-whether-a-number-is-prime-or-not/

【讨论】:

  • 谢谢!感谢您的帮助!
【解决方案2】:
import math
def is_prime():

    inp = input("Enter your number: ")
    if not (inp.isdigit() and float(inp).is_integer() and  float(inp) > 1):
        raise ValueError("Not an integer, try again")

    val = int(inp)
    root = int(math.sqrt(val));
    for i in range(2 , root+1 , 1):
        if(val%i==0):
            return False

    return True

print(is_prime())

这是一个 O(sqrt(n)) 中的有效算法。

【讨论】:

  • 感谢反馈!
【解决方案3】:

嗯,我会做一些修改。第一个也是最明显的效率问题是,您不必检查从 1 到您的测试整数的每个数字是否是除数,因为理论上可能的最高除数只有测试大小的一半整数。

这会立即将循环缩短 2 倍。我们可以将其设置为:

i = val // 2

您也不必只对以后的return ret 执行ret = True,在这个简单的情况下您可以简单地return Truereturn False 也是如此,这将真正帮助我们提高效率,因为一旦我们找到一个除数,我们就可以返回 False 并完成,无需让函数继续运行计算。

另一件事 - 一个名为 is_prime 的函数听起来应该接受一个整数参数,而不是在函数体中请求一个,所以可能将输入请求放在它之外。 (我认为一旦另一个 excersize 要求您检查多个素数范围,这将对您有所帮助)

另一件事是顶部的整数验证。不需要所有这些条件,因为val = int(inp) 无论如何都会抛出ValueError,如果值低于1,你的循环将永远不会开始(在我的示例中它不会低于4,它只会立即return True )。

我所说的全部结合起来:

def is_prime(val):
    i = val // 2
    while(i > 1):
        if(val % i == 0):
            return False
        i = i -1
    return True

inp = input("Enter your number: ")
result = is_prime(int(inp))
print(result)

让我们测试一下:

>>> for i in range(40):
...     if is_prime(i):
...             print(i)
...
0
1
2
3
5
7
11
13
17
19
23
29
31
37

您可以随时添加检查 01 的值,让它们根据您的练习条件的需要评估为 False

顺便说一句,这可能都是一行:

def is_prime(val):
    return not any(val % i == 0 for i in range(val // 2, 1, -1))

你可以自己测试一下,结果和上面的例子是一样的

【讨论】:

  • 感谢您的反馈!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 2019-11-07
  • 2014-06-09
  • 2021-09-05
  • 2017-11-21
相关资源
最近更新 更多