使用“积分系统”打印数字的素数

时间:2018-07-17 22:28:56

标签: python

编写一个打印输入数字素数的程序遇到了挑战。我们给出了一个大纲:该程序检查原始数字的因子;每个这样的因素得一分。然后,如果该因素是主要因素,那就另当别论了。每个带有两点的因子都会被打印出来。

这是我到目前为止所拥有的。

print('Please enter a number')
x = int(input('Number:'))
a = int(0)
b = int(0)
c = int(1)
d = int(0)
counter = int(0)
while (a < x-1):
    a = a + 1
    counter = 0
    if (x / a % 1 == 0):
        b = a
        counter = counter + 1
        while(c < b - 1):
            c = c + 1
            if((b / c) % 1 != 0):
                d = b
                counter = counter + 1
                if(counter == 2):
                    print(d)

输入15,我得到3和5,但也得到15(错误)。有了24,我得到3、4、6、8和12。其中一些不是素数。

我认为问题出在最内层的循环中,但是我无法查明问题所在。

起初,问题是我没有重置“计数器”,因此将来的因素将超过2个“点”,并且什么都不会打印。我通过在它进入最内层循环之前对其进行了重置来解决该问题,但遗憾的是,这并不能解决问题。

我还尝试摆脱了'b'和'd'并仅使用两个变量来查看我是否在某种程度上使它过于复杂,但这也无济于事。

编辑:为清晰起见,对其进行了稍微的编辑。

2 个答案:

答案 0 :(得分:0)

我不确定是否完全遵循您的问题描述,但这是我尽力解释的尝试:

import math

def is_factor(n,m):
    return m % n == 0

def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))

def assign_points(n):
    for i in range(1,n+1):
        if is_factor(i,n) and is_prime(i):
            print('two points for: ', i)
        elif is_factor(i,n):
            print('one point for: ', i)

print(assign_points(15))

答案 1 :(得分:0)

您的第一句话足以让我了解您发布的其余内容。您的主要问题是循环处理和确定素数的逻辑。

总的来说,我认为您的程序设计为

  • 输入目标号码
  • 找到数字的每个因数
  • 对于每个因子,确定因子是否为质数。如果是这样,请打印出来。

现在,让我们看一下最里面的循环:

    while(c < b - 1):
        c = c + 1
        if((b / c) % 1 != 0):
            d = b
            counter = counter + 1
            if(counter == 2):
                print(d)

作为样式说明,请解释为什么要从for循环中构建while逻辑;这使您的程序难以阅读。变量d对您没有任何帮助。另外,对counter的处理会带来额外的麻烦:只要您确定b是质数,就只需打印即可。

主要问题是您的逻辑决策点:您正在寻找b的因素。但是,与其等到知道b是质数,不如立即发现不小于b任何个数字,就打印它。由于b-1很少是b的因数(仅当b = 2时),因此您会错误地将 any b值标识为素数。

相反,您必须等到尝试所有个可能的因素。像这样:

is_prime = True
for c in range(2, b):
    if b % c == 0:
        is_prime = False
        break

if is_prime:
    print(b)

还有更多的“ Pythonic”方法可以做到这一点,但是我认为这更多地体现在您当前的编程技巧中。如果有必要完成分配,则只能在没有发现任何因素的情况下添加一个点,然后在离开for循环之后检查计数。

你能从那里拿走吗?