编写一个打印输入数字素数的程序遇到了挑战。我们给出了一个大纲:该程序检查原始数字的因子;每个这样的因素得一分。然后,如果该因素是主要因素,那就另当别论了。每个带有两点的因子都会被打印出来。
这是我到目前为止所拥有的。
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'并仅使用两个变量来查看我是否在某种程度上使它过于复杂,但这也无济于事。
编辑:为清晰起见,对其进行了稍微的编辑。
答案 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
循环之后检查计数。
你能从那里拿走吗?