【问题标题】:Why is my Python code displaying the wrong result?为什么我的 Python 代码显示错误的结果?
【发布时间】:2019-03-07 17:18:20
【问题描述】:

我有一个读取 2 个整数 m 和 n 的代码,并打印 m 和 n(包括 m 和 n)之间的所有 perfect numbers。如果我输入 2 和 7,它应该给我 6。但它给我 13。出了什么问题?

m=int(input())
n=int(input())

myList=[]

for i in range(m,n+1):
    for j in range(1,i):
        if i%j==0:
            myList.append(j)

sum=0
for i in range(0,len(myList)):
    sum=sum+myList[i]
    for j in range(m,n+1):
        if sum==j:
            sum=j

print(sum)

【问题讨论】:

  • 1.不要将名称 sum 用于变量。它隐藏了内置的sum 函数。 2.if sum == j: sum = j这个if的目的是什么?没有意义
  • 把 j 存储在 sum 中,所以 print 函数可以移到 for 循环之外,避免被多次打印
  • @mkrieger1 一个完美的数字是它的适当除数之和,所以 1 作为除数包括在内,但数字本身不是。例如,6、28。
  • @YolandaHui 整个嵌套循环可以用一行替换,print(sum(myList))(如果你不这样做sum = 0当然)

标签: python python-3.x


【解决方案1】:

你让这变得比它需要的更复杂。你需要一个嵌套循环来解决这个问题。遍历范围内的每个数字,将值 x 设置为 0,每次找到一个均分的数字时,将其添加到 x。如果在你的内部循环结束时,x == i,那么你有一个完美的数字并将其打印出来。如果您在列表中需要它,请将其附加到您的列表中。您正在尝试保存所有中间数字,如果找到结果就保存它。

for i in range(m,n+1):
    x = 0
    for j in range(1,i):
        if i % j == 0:
            x += j
    if i == x:
        print(i)

【讨论】:

    【解决方案2】:
    m=int(input())
    n=int(input())
    
    '''
    mylist =[]  instead of using myList to keep track of factors 
    just use sum_of_factors_of_i variable and keep adding newly found factors to 
    it by doing so you will not need to loop over myList to get sum.
    '''
    for i in range(m,n+1):
        sum_of_factors_of_i = 0
        for j in range(1,i):
            if i%j==0:
                sum_of_factors_of_i += j
    
        if sum_of_factors_of_i == i:
            print(i)
    
    '''        
    input 
    2
    7
    
    output
    6
    ----------------------------------
    input
    2
    30
    
    output
    6
    28
    '''
    

    【讨论】:

      【解决方案3】:

      你想做的是这样的。

      将一个数字的所有除数(除了该数字本身)添加到一个列表中,然后检查该列表的总和是否等于该数字。如果相等则打印数字否则取下一个数字

      m=int(input())
      n=int(input())
      
      
      for i in range(m,n+1):
      
          myList=[]
          for j in range(1,i):
              if i%j==0:
                  myList.append(j)
          if sum(myList)==i:
              print(i)
      

      输入

      2
      7
      

      输出

      6
      

      【讨论】:

      • 2 和 6 不是完美的数字。
      • 2 7 是输入输出是 6 对不起,我没有指出
      • 而 6 是完美的,它的除数是 1+2+3 ==6
      • 不会将所有除数添加到所有数字的列表中吗??
      【解决方案4】:

      您应该迭代到 n/2,因为任何“数字”都不能被任何大于“数字”一半的数字整除。

      for i in range(m, n+1):
          _sum = 0
          for j in range(1, int(i/2)+1):
              if i%j==0:
                  _sum += j
          if _sum==i:
             print(i)
      

      【讨论】:

      • 是的,并且可以通过搜索成对的因子并在平方根处停止来进一步优化。但是,为什么还要麻烦将它们保存到列表中呢?只要找到它们就加起来。
      • 让我看看哪个操作更便宜,追加或求和。
      • 即使你使用了一个列表,你最终还是需要做加法。加法本身非常快,当数字有数千位时,创建一个新的 Python 整数对象最终会变慢。但这不是这里的问题。
      • 查看验证 8589869056 是否完美需要多长时间。 ;)
      猜你喜欢
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      相关资源
      最近更新 更多