为什么for循环两个写法输出结果不一样?

为什么for循环两个写法输出结果不一样?

小白菜疑问,能不能详细地跟我说一下两种写法的区别?

题目:使用函数求素数和:

  • 定义prime(p), 其中函数prime当用户传入参数p为素数时返回True,否则返回False
  • 定义PrimeSum(m,n),函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数1<=m<n

假设输入m=1,n=10

疑问:下面是两种不同的写法,第一个是我写的,第二个是正确答案TT,我不太能理解第一种把return True放在for循环里会把不是素数的9给算进去,但是把return True移到for循环外面去就不会了

def prime(p):

if p==0 or p==1:

return False

elif p==2:

return True

else:

for I in range(2,p):

if p%I==0:

return False

else:

return True

def PrimeSum(m,n):

sum=0

for i in range(m,n):

if prime(i):

sum+=i

else:

sum+=0

return sum

m,n=input().split()

m=int(m)

n=int(n)

print(PrimeSum(m,n))

def prime(p):

if p==0 or p==1:

return False

elif p==2:

return True

else:

for I in range(2,p):

if p%I==0:

return False

return True #这里的区别

def PrimeSum(m,n):

sum=0

for i in range(m,n):

if prime(i):

sum+=i

else:

sum+=0

return sum

m,n=input().split()

m=int(m)

n=int(n)

print(PrimeSum(m,n))

如果m=1,n=10,那在这个范围内sum=2+3+5+7=17,但是我第一种方法写的是sum=2+3+5+7+9=26...TT麻烦跟我解释一下这两个的区别。谢谢感激


回答:

在第一种写法中,如果p不是素数,那么在第一次循环时就会执行else语句并返回True,因此它会错误地将非素数的数字标记为素数。例如,在循环到9时,9%2!=0,因此它会执行else语句并返回True,导致9被标记为素数。

而在第二个写法中,在for循环结束后才返回True。这意味着只有当所有的i都不能整除p时才返回True,从而保证了正确性。

因此,把return True放在for循环外面是更加准确和可靠的做法。

(最后说一句题外话,楼主的提问描述很详细,有利于回答者思考和后来者参考,值得点赞!)


回答:

  • 你自己的写法:

    if p%I==0:

    return False

    else:

    return True

  • 在判断的过程中只要不满足 p%I==0 就会直接返回 false ,也就是说你在验证某个数字是否为质数时,并没有从头到尾遍历一遍,而是在遍历过程中只要碰到 p%I!=0 的情况就已经结束了遍历,这样并不能保证正确性。
  • 而应该如你提到的第二种方式那样,从头到尾遍历完,发现 p 这个数字除了 1 * p,没有其他组合才可以返回 true

以上是 为什么for循环两个写法输出结果不一样? 的全部内容, 来源链接: utcz.com/p/938908.html

回到顶部