<强>一、前言强>
今天学习视频时课后作业是找出1000年以内既是素数又是回文数的数,写代码这个很容易,结果一运行遇到了错误,输出结果跟预期不一样,调试了快30分钟,再接着一通搜索和回看视频才发现问题所在。所以特地写下来,方便以后查看。问题的关键是判断素数过程中对…其他的用法上(具体看后面代码)
<强>二,实现判断素数的功能强>
质数(质数),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数).via——维基百科
所以采用穷举法只要在2 ~ n - 1的区间,没有一个数能整除n,那么n就是素数。
对2-n-1区间进行合理优化,假设x * y=n (x<=y),那么当x和y相等时,x有最大值。即x=y=sqrt (n),所以x的区间就可以限制为2 ~ 12 (n) + 1。还有疑问,可以在再多想想,纸上算一算。
因为这里要用到sqrt()方法,所以需要导入数学模块。
不多说,直接上代码:
#求解1000年以内的所有素数,正确版本 导入数学 num=2 数=0 list_s=[] max_d=1000 而num & lt;max_d: 长度=int (math.sqrt (num) + 1) #对遍历范围进行合理优化 因为我在范围(长度):#注意从2开始 如果num %我==0: 打破 为对其他:#这里的其他跟齐,而不是跟,如果表示只有在顺利执行时,其他才执行 数+=1 list_s.append (num) #存入列表 num +=1 如果count==0: print (max_d”,以内没有素数”) 其他: 打印(max_d”,以内的素数有”,统计,“个,分别是:‘,list_s) >之前输出结果:
这个代码完全没有问题,然后下面给出一个有问题的代码:
#求解40以内的所有素数,错误版本 导入数学 num=2 数=0 list_s=[] max_d=40 而num & lt;max_d: 长度=int (math.sqrt (num) + 1) #对遍历范围进行合理优化 因为我在范围(长度):#注意从2开始 如果num %我==0: 打破 其他:#这里的其他跟如果对齐,会导致一个素数会被写入int (math.sqrt (num)) 1次,同时一些非素数也会被当做素数 数+=1 list_s.append (num) #存入列表 num +=1 如果count==0: print (max_d”,以内没有素数”) 其他: 打印(max_d”,以内的素数有”,统计,“个,分别是:‘,list_s) >之前输出结果:
所以,一定要认真对待循环中其他人对齐问题。这个在解决素数问题中很重要。小结一下,而其他…和其他…
只有循环完所有次数,才会执行,循环体中有继续存在,也不影响其他执行。
一旦循环体中触发了,就会阻止其他语句块的执行。
<强>三,实现判断回文数的功能强>
回文数即从左到右和从右到左一样。如:12321 .
方法:
把已知的num1数反过来,得到num2,如123年变为321年,采用//10% 10 * 10等运算操作,其中还要借助一个临时变量tmp
判断如果num1==num 2,则num1是回文数、反之不是
代码如下:
#求解1000年以内的所有回文数 num=0 #这里num从0开始 list_h=[] max_d=10000 数=0 而num & lt;max_d: tmp=num num_p=0 在tmp !=0: num_p=num_p * 10 + 10 tmp % tmp//=10 如果num_p==num: list_h.append (num) 数+=1 num +=1 如果count==0: print (max_d”,以内没有回文数”) 其他: 打印(max_d”,以内的回文数有”,统计,“个,分别是:‘,list_h) >之前更新:对于判断回文数或者回文字符串,采用双端队列的数据结构,会非常简单。实现如下:
从集合进口双端队列 def回文(词): dq=双端队列(单词) len (dq)比;1: 如果dq.pop () !=dq.popleft (): 返回假 还真 if __name__==癬_main__”: max_num=10000 因为我在范围(max_num): s=str(我) 如果回文(s): 打印(我,结束=" ")解决Python中回文数和质数的问题