无法检查数字是否完美

时间:2016-01-31 17:18:17

标签: python python-3.x

我正在尝试学习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')

4 个答案:

答案 0 :(得分:5)

现在是时候了......

DEBUGGING !!!

我将您的代码粘贴到一个文件中,然后运行它:

$ 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))

这种情况没有发生,因为缩进是错误的!要进入forif应与归属地位于同一行:

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时,是否是为你的加法除数增加的决定因素)总)。

  1. 您需要以不同方式嵌套if - else语句(见下文)。

  2. 与原始数字相比,您需要将总数除以2。你的代码使用完美数字的方式 - 比如6 - 它发现1,2,3和6都是除数。因此,总和将为12 - 需要除以2才能产生正结果。

  3. 调整后的代码是:

    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)