当前位置 主页 > 服务器问题 > Linux/apache问题 >

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

    栏目:Linux/apache问题 时间:2019-11-25 10:57

    一、前言

    今天学习视频时课后作业是找出1000以内既是素数又是回文数的数,写代码这个很容易,结果一运行遇到了bug,输出结果跟预期不一样,调试了快30min,再接着一通搜索和回看视频才发现问题所在。所以特地写下来,方便以后查看。问题的关键是判断素数过程中for…else的用法上(具体看后面代码)

    二、实现判断素数的功能

    质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个因数的数)。via——Wikipedia

    所以采用穷举法只要在2~n-1的区间,没有一个数能整除n,那么n就是素数。

    对2-n-1区间进行合理优化,假设x*y=n(x<=y),那么当x和y相等时,x有最大值。即x=y=sqrt(n),所以x的区间就可以限制为2~sqrt(n)+1。还有疑问,可以在再多想想,纸上算一算。

    因为这里要用到sqrt()方法,所以需要导入math模块。

    不多说,直接上代码:

    # 求解1000以内的所有素数,正确版本
    import math
    
    num = 2
    count = 0
    list_s = []
    max_d = 1000
    while num < max_d:
     length = int(math.sqrt(num)+1) # 对遍历范围进行合理优化
     for i in range(2,length): # 注意从2开始
      if num % i == 0:
       break
     else: # 这里的else跟for对齐,而不是跟if,表示只有for顺利执行时,else才执行
      count += 1
      list_s.append(num) # 存入列表
     num += 1
    if count == 0:
     print(max_d,'以内没有素数')
    else:
     print(max_d,'以内的素数有',count,'个,分别是:',list_s)
    

    输出结果:

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

    # 求解40以内的所有素数,错误版本
    import math
    
    num = 2
    count = 0
    list_s = []
    max_d = 40
    while num < max_d:
     length = int(math.sqrt(num)+1) # 对遍历范围进行合理优化
     for i in range(2,length): # 注意从2开始
      if num % i == 0:
       break
      else: # 这里的else跟if对齐,会导致一个素数会被写入int(math.sqrt(num))-1次,同时一些非素数也会被当做素数
       count += 1
       list_s.append(num) # 存入列表
     num += 1
    if count == 0:
     print(max_d,'以内没有素数')
    else:
     print(max_d,'以内的素数有',count,'个,分别是:',list_s)
    

    输出结果:

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

    只有循环完所有次数,才会执行 else ,循环体中有continue存在,也不影响else执行。

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

    三、实现判断回文数的功能

    回文数即从左到右和从右到左一样。如:12321。

    方法:

    把已知的num1数反过来,得到num2,如123变为321,采用//10 %10 *10等运算操作,其中还要借助一个临时变量tmp

    判断如果num1 == num 2,则num1是回文数,反之不是

    代码如下:

    # 求解1000以内的所有回文数
    num = 0 # 这里num从0开始
    list_h = []
    max_d = 10000
    count = 0 
    
    while num < max_d:
     tmp = num
     num_p = 0
     while tmp != 0:
      num_p = num_p*10 + tmp % 10
      tmp //= 10
     if num_p == num:
      list_h.append(num)
      count += 1
     num += 1
      
    if count == 0:
     print(max_d,'以内没有回文数')
    else:
     print(max_d,'以内的回文数有',count,'个,分别是:',list_h)