我正在尝试学习python,但我遇到了一个错误。
所以,这里是我试图运行的程序的代码:检查一个数字是否是一个完美的数字:
total=0
x=0
number=input('Enter a number to be checked whether it is perfect or not:')
number=int(number)
for divisor in range(1,number+1):
x=number%divisor
if x==0:
total+=x
else:
print('The number' +str(x)+'is not a divisor of' +str(number))
print('\n'+ 'The sum is:' +str(total))
if number==total:
print('The number' +str(number) + 'is a perfect number')
else:
print('The number' +str(number) +'is not a perfect number')
答案 0 :(得分:5)
现在是时候了......
我将您的代码粘贴到一个文件中,然后运行它:
$ python3 p.py
Enter a no to be checked whether it is perfect or no:6
The sum is:0
The no6is not a perfect no
嗯,6 是一个完美的数字,那么发生了什么?
阅读您的代码,我感觉下面的if
预计会在for
的每个值上运行,右:
for divisor in range(1,number+1):
x=number%divisor
if x==0:
total+=x
else:
print('The no' +str(x)+'is not a divisor of' +str(number))
这种情况没有发生,因为缩进是错误的!要进入for
,if
应与归属地位于同一行:
for divisor in range(1,number+1):
x=number%divisor
if x==0:
total+=x
else:
print('The no' +str(x)+'is not a divisor of' +str(number))
所以,让我们再试一次:
$ python3 p.py
Enter a no to be checked whether it is perfect or no:6
The no2is not a divisor of6
The no1is not a divisor of6
The sum is:0
The no6is not a perfect no
嗯,还是错的。
奇怪的是,它说2和1不分6。荒谬!但它实际上是print()
调用的问题:
print('The no' +str(x)+'is not a divisor of' +str(number))
x
不是除数 - x
是剩下的!
好吧,你搞砸了变量了。当存在许多变量时,这是正常的......并且它们没有有意义的名称。然后,我们将x
重命名为rest
:
for divisor in range(1,number+1):
rest=number%divisor
if rest==0:
total+=rest
else:
print('The no' +str(rest)+'is not a divisor of' +str(number))
当然印刷的信息错了:我想要显示除数,而不是其余的!让我们改变一下:
print('The no' +str(divisor)+'is not a divisor of' +str(number))
现在有了一些有趣的事情:我们将 rest 添加到总计......
if rest==0:
total+=rest
...但我们应该加上除数!让我们纠正一下:
for divisor in range(1,number+1):
rest=number%divisor
if rest==0:
total+=divisor
else:
print('The no' +str(divisor)+'is not a divisor of' +str(number))
最后!现在该程序将正常工作......或者它会吗?
$ python3 p.py
Enter a no to be checked whether it is perfect or no:6
The no4is not a divisor of6
The no5is not a divisor of6
The sum is:12
The no6is not a perfect no
荡!
为什么说这笔钱是12?好吧,让我们再看看循环:
for divisor in range(1,number+1):
哦,现在我明白了......让我们打电话给它打印数字:
>>> number = 6
>>> for divisor in range(1,number+1):
... print(divisor)
...
1
2
3
4
5
6
就是这样!当您将循环从1运行到number+1
(在本例中为7)时,将处理数字本身(6)。好吧,6是6的除数,所以它也被添加到总...复制它!所以你应该只去数字:
for divisor in range(1,number):
有用吗?请参见此处的输出:
$ python3 p.py
Enter a no to be checked whether it is perfect or no:6
The no4is not a divisor of6
The no5is not a divisor of6
The sum is:6
The no6is a perfect no
$ python3 p.py
Enter a no to be checked whether it is perfect or no:28
...
The no27is not a divisor of28
The sum is:28
The no28is a perfect no
$ python3 p.py
Enter a no to be checked whether it is perfect or no:9
The no2is not a divisor of9
...
The no8is not a divisor of9
The sum is:4
The no9is not a perfect no
是!
我想你很难看到所有的问题,因为有很多问题。秘诀是:每次学会看一个问题。
答案 1 :(得分:1)
您的代码存在以下几个问题:
1.你在对除数求和时引用x
,但你要引用divisor
- x是模数计算的结果(当为0时,是否是为你的加法除数增加的决定因素)总)。
您需要以不同方式嵌套if - else
语句(见下文)。
与原始数字相比,您需要将总数除以2。你的代码使用完美数字的方式 - 比如6 - 它发现1,2,3和6都是除数。因此,总和将为12 - 需要除以2才能产生正结果。
调整后的代码是:
total=0
x=0
number=input('Enter a no to be checked whether it is perfect or no:')
number=int(number)
for divisor in range(1,number+1):
x = number % divisor
if x == 0:
print divisor
total += divisor
else:
print('The no' +str(divisor)+'is not a divisor of' +str(number))
print('\n'+ 'The sum is:' +str(total))
if number==total/2:
print('The no' +str(number) + 'is a perfect no')
else:
print('The no' +str(number) +'is not a perfect no')
答案 2 :(得分:0)
我猜你已经忘记了" 2 *"在你的代码中。
这是一种测试数字是否完美的简单方法:
def sumDiv(n):
s = 0
for k in range(1,n+1):
if n%k==0:
s+=k
return s
def isPerfectNumber(n):
return 2*n == sumDiv(n)
number = 6 # for example
if isPerfectNumber(number):
print("{} is a perfect number".format(number))
答案 3 :(得分:0)
我认为你的意思是'素数'。如果是这样,它不是学习Python的最佳方法,因为素数检查算法并不那么简单,因此可以用C编写得更好,然后用Python包装。 如果你想要一个天真的检查,这是它的样子:
def is_prime(number, *, verbose=False):
divisor = int(number / 2)
for divisor in range(divisor, 1, -1):
if number % divisor == 0:
return False, divisor if verbose else False
return True, None if verbose else True
numbers = [27, 11, 13, 2, 4]
for i in numbers:
print('Number ',i,'\tResult:',is_prime(i, verbose=True))
Number 27 Result: (False, 9)
Number 11 Result: (True, None)
Number 13 Result: (True, None)
Number 2 Result: (True, None)
Number 4 Result: (False, 2)