检查一个数字是否为Armstrong的Python程序不起作用,我在做什么错?

时间:2018-10-13 03:15:00

标签: python

n=int(input("Enter a Number: "))
x=0
y=0
z=0

while(n>0):
    x=n%10
    y=x**3
    z=z+y
    n=n//10

print (z) 


#The z here is the same value which I enter, yet it doesn't work.
#If I enter 407 as n, z becomes (4^3)+(0^3)+(7^3) which is 407

 if (z==n): 

#But even when 407==407, it just wont print the bottom statement


    print ("The number is Armstrong")
else:
    print ("The number isn't Armstrong")
 #it prints that it isn't an Armstrong number

6 个答案:

答案 0 :(得分:1)

while循环之后,n已经成为4//10的{​​{1}},因此它永远不会等于0的407。

您将需要保留原始输入的副本以进行比较。

作为一般建议,请使用调试器或至少z个对象来查看分配在哪里出错。

答案 1 :(得分:1)

不使用任何内置方法

阿姆斯壮编号为371,因为3**3 + 7**3 + 1**3 = 371。根据此规则123不是阿姆斯特朗数,因为1**3 + 2**3 + 3**3 is not equal to 123

def count_digit(n):
    count = 0
    while n > 0:
        count += 1
        n //= 10
    return count

def is_armstrong(n):
    given = n
    result = 0
    digit = count_digit(n)
    while n > 0:
        reminder = n % 10
        result += reminder ** digit
        n //= 10 
    return given == result
is_armstrong(371)
>> True

is_armstrong(123)
>> False

答案 2 :(得分:0)

定义:如果将n中每个数字的总和乘以n中总数字的幂,则数字nArmstrong number 1}}。

跟踪原始数字n非常重要,因为需要将其与n(您的变量代表总和)的结果进行比较。由于您要在z循环中对n进行突变,因此没有理由将其与原始输入进行比较,因此while的运行效果并不理想。将if (z==n):保存为另一个变量n,然后将其减小为0。

此外,您的代码已任意选择3作为数字中的数字。为了使您的功能可以正确使用任何数字,您需要一种计数其位数的方法。一种方法是将数字转换为字符串并采用长度。

我强烈建议您使用描述性变量名,以减少混淆自己和他人的机会。显然,original代表您的总和,z代表您的余数,这是通过阅读代码来实现的。如果代码变得更长或更复杂,那么理解就可能是一场噩梦。

最后,从样式的角度来看,Python并不是一种特别灵活的语言。我建议尽可能坚持使用style guide,以保持代码可读性。

这是一个可行的示例:

x

输出:

def armstrong(n):
    total = 0
    original = n
    digits = len(str(abs(n)))

    while n > 0:
        remainder = n % 10
        total = total + remainder ** digits
        n = n // 10

    return total == original


if __name__ == "__main__":
    while 1:
        print(armstrong(int(input("Enter a Number: "))))

Try it!

答案 3 :(得分:0)

您可以将初始数字作为字符串输入,以便我们更轻松地将其转换为列表。然后,我们可以map创建ints的列表。之后,我们可以使用列表推导将列表中的所有int提升为列表中len的幂。如果此列表中的sum等于我们的输入,则我们有一个Armstrong编号。

n = input('Enter a number: ')
nums = list(map(int, n))
raised = [i**len(nums) for i in nums]
if sum(raised) == int(n):
    print('The number is Armstrong')
else:
    print('The number is not Armstrong')

扩展列表理解:

raised = []
for i in nums:
    i = i**len(nums)
    raised.append(i)
print(raised)

替代map

nums = []
for i in n:
    i = int(i)
    nums.append(int(i))

答案 4 :(得分:0)

我更正了您的代码:

if(\Illuminate\Support\Facades\Auth::check()) {
    return abort(404);
}

#Rest of the code is for guest user.....
#

但是您仍然可以在许多方面做得更好。查看vash_the_stampedeggorlen的代码。

或者:

const permutations = array => {
  let permut = [];
  helperFunction(0, array, permut);
  return permut;
};

const helperFunction = (i, array, permut) => {
  if (i === array.length - 1) {
    permut.push(array.slice());
  } else {
    for (let j = i; j < array.length; j++) {
      swapElements(i, j, array);
      helperFunction(i + 1, array, permut);
      swapElements(i, j, array);
    }
  }
};

function swapElements(a, b, array) {
  let temp = array[a];
  array[a] = array[b];
  array[b] = temp;
}

console.log(permutations([1, 2, 3]));

答案 5 :(得分:0)

total=0

def Armstrong(n):
    m=list(n)
    global total
    for i in m:
        total+=pow(int(i),len(n))
    if total==int(n):
        print ("it is Armstrong number")
    else:
        print("it is not Armstrong number")

Armstrong(input("enter your number"))
print(total)