首页 > 编程知识 正文

python1000以内的素数之和,python一百以内素数之和

时间:2023-05-06 07:20:37 阅读:195796 作者:3816

今天做到一题利用for循环求100以内素数之和的题目,发现自己在Python的语法上遇到了问题:这个else是谁的?在此记录以防下次又做错啦。

题目很简单:
100以内素数之和
求100以内所有素数之和并输出。 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

素数指从大于1,且仅能被1和自己整除的整数。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬可以逐一判断100以内每个数是否为素数,然后求和。

一开始我的程序是这样的:

sum = 0 for i in range(2,100):#寻找的范围为2-99 for j in range(2,i): if (i%j == 0): break else: sum += i print(sum)

然而输出时sum却等于66705!
这明显不对呀!
为了初步排查我找到的素数是否有问题,修改了一下程序

sum = 0for i in range(2,100):#寻找的范围为2-99 for j in range(2,i): if (i%j == 0): break else: print(i) #sum += i#print(sum)

果然输出的素数是有问题的。查看结果发现找到的素数出现了多次输出甚至输出非素数的情况,加起来当然比正确答案大的多啦。

可是为什么会出现这样的错误呢?

复习一下:
break语句:用于跳出最内层的for或while循环,即一个break语句只有能力跳出当前层次的一个循环。跳出这个循环后从这个循环后面的代码继续执行。
if-else二分支:如果满足if后的条件,就执行冒号后面的语句;否则执行else冒号后面的语句。二分支结构用于区分对if后条件的两种可能,满足条件即True,不满足条件即False,以此分别形成执行路径。

所以,在上面这个程序中,双层for嵌套后利用了一个if-else二分支。如果满足条件:i对j取余数为零(i<j,排除了i=j的情况),说明i除了1和它本身之外还能被其他整数整除,那么这个i并不是一个素数,利用break跳出循环继续寻找素数;如果不满足这个条件,就说明找到了一个素数i,执行else冒号后面的语句打印这个素数,并返回对j的for循环。然而对j的循环是从2循环到i的前一个数,如果i是一个素数,不论j是多少都除不尽。因此,每遍历一个j→除不尽→打印i。除不尽几次就打印了几次i,使得多次输出该素数造成了输出不准确。甚至对于某个非素数i,如果与目前遍历得到的j除不尽,也会一直打印i直到i与j能够除得尽跳出对j的循环。

再复习一下:
for in-else语句:遍历在in后面的遍历结构,当for循环正常遍历了所有内容或由于条件不成立而结束循环,且没有因为break或return而跳出循环时,才执行else后面的语句。

这里的“else”是for的,还是if的?显然,应该是for的。只有遍历全部j后依然除不尽的才能够认为i为素数并输出。写程序时太粗心写错了else的位置;对于Python语法的不熟练没能透彻的结合题目的意思。意识到问题所在,修改程序

sum = 0for i in range(2,100): for j in range(2,i): if (i%j == 0): break else: sum += iprint(sum)

输出sum=1060,是正确答案!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。