解决Python中回文数和质数的问题

  

<强>一、前言

  

今天学习视频时课后作业是找出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)   之前      

输出结果:

  

解决Python中回文数和质数的问题

  

这个代码完全没有问题,然后下面给出一个有问题的代码:

        #求解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)   之前      

输出结果:

  

解决Python中回文数和质数的问题

  

所以,一定要认真对待循环中其他人对齐问题。这个在解决素数问题中很重要。小结一下,而其他…和其他…

  

只有循环完所有次数,才会执行,循环体中有继续存在,也不影响其他执行。

  

一旦循环体中触发了,就会阻止其他语句块的执行。

  

<强>三,实现判断回文数的功能

  

回文数即从左到右和从右到左一样。如: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中回文数和质数的问题