我是python的新手,试图编写用于查找amstrong和模数的程序。但是我找到amstrong没有问题,它不会进入结束状态,挂在中间。但是,模数工作正常。它不会抛出任何错误。这是我的代码:
try:
def check(s):
if(s==1):
print 'enter the no'
v=[]
s=int(raw_input())
print s
for x in str(s):
print x
v.append(x)
print v
x=len(v)
i=0
y1=0
print v[0]
while(i<x):
y=int(v[i])
y=y**3
y1=y1+y
print y1
if(y1==s):
print "given no",s,"is amstrong no"
else:
print "given no",s,"is not a amstrong no"
elif(s==2):
print 'enter the 1st no'
s=int(raw_input())
print 'enter the 2nd no'
s1=int(raw_input())
ans=s%s1
print 'modulus ans is',ans
finally:
print "bye bye"
try:
print "1.amstrong 2.modulus"
x=int(raw_input())
if(x>=1 and x<=2):
check(x)
finally:
print 'bye bye'
请帮我解决这个问题。
答案 0 :(得分:5)
它挂在中间的原因是你进入while
循环while(i<x):
,但你永远不会改变i
或{{1}的值}。 (你确实改变了x
和y
,但是你的条件并不涉及。)条件永远不会变成虚假,并且永远不会变成虚假,所以它继续永远执行。
另请注意,您并未正确使用y1
块。除非您使用try
来处理任何异常,否则使用try
毫无意义。 (在不同的层面上,您不应该首先在except
块中包含整个代码 - 例外是有用的信息,可以更容易地发现您的程序不是正确工作,忽略它们会导致不可预测,难以调试的状态。)
最后一条建议 - 通过对变量使用不同的,相关的名称来识别和解决问题几乎普遍变得更容易(对我们两个人来说) - 很难弄清楚你的问题是什么在每个变量都是一个字母的时候做,有些只是你已经使用过的数字的字母。
答案 1 :(得分:0)
您可以使用下面编码的功能检查数字是否是3位数的ammstrong。 然而,这仅限于3位数,但正确使用循环,这也可以使用更多的数字。几乎就像你做的那样。但是总是记得增加或减少循环计数器以防止无限循环。否则循环&#34;将不会进入结束状态,挂在中间&#34;。
def Ammstrong(s):
n1=s/100
#n1 contains the 1st digit of number, s.
n2=s%100
n2=n2/10
#n2 contains the 2nd digit of number, s.
n3=s%10
#n3 contains the 3rd digit of number, s.
number=(n1**3)+(n2**3)+(n3**3)
if number==s:
print number,"is an Ammstron Number"
#return number
else:
print number,"is not an Ammstron Number"
#return number
num=input(Enter a number: ")
Ammstrong(num)
#use this if return is uesd:
#number=Ammstrong(num)
此功能将打印答案。因此,不需要在main函数中使用print函数来打印你的答案。
如果您希望进行进一步的计算,请使用&#39; return&#39;。这在使用注释的编码中说明。但是,只要执行返回执行,执行语句的程序就会终止。意味着该函数将终止而不是主程序。因此,在打印功能之后使用返回功能。 如果确实使用了返回函数,则必须将返回的值存储在变量中。
还有一件事: 在启动变量x之前,您已经使用了变量x。 并且,而不是使用(s == 2)语句使用(s!= 0)。 &#34;!=&#34;是&#34;不等于&#34;
的符号学习python好运。这是一种非常有趣的语言。
http://pythontutor.com将逐步显示代码的执行情况。