题目:

每日一练(2-26):
题目:将一个整数分解质因数。例如:输入90,打印出90=2*3*3*5

实现方法:

百度百科里对分解质因数的定义:
把一个合数分解成若干个质因数的乘积的形式,即求质因数的过程叫做分解质因数。
分解质因数只针对合数。(分解质因数也称分解素因数)求一个数分解质因数,要从最小的质数除起,一直除到结果为质数为止。分解质因数的算式叫短除法,和除法的性质相似,还可以用来求多个数的公因式。
只需要用while for循环即可解决,适合新手入门python进行练习,本文将由易到难介绍几种实现思路,并附上代码和所需要的知识点。

参考答案

思路:暴力算法,死循环计算,缺点:耗时

# 学习交流请来Python学习群:922624810【或加个人WX: felix107ye 】
num = 90def gongyz(num):for i in range (2,num):if num % i == 0:print(i)return gongyz(num//i)print(num)
gongyz(num)

输出:

2
3
3
5
[Finished in 0.2s]
其他思路参考答案

思路1:首先设置函数判断是否是质数,然后依次进行分解

# -*- coding: utf-8 -*-
# @Time    : 2020年2月27日
# @Software: PyCharm
# from Python学习交流群:922624810#判断数据是否是质数,用于保证大整数分解时每一个因子都是质数
def zhishu(num):for i in range(2,num):if num % i == 0:#print('%d 是个合数,可以分解' %num)return True#break 楼主之前一个版本加了break,忽略了函数return之后其他语句不会执行,相当于break了。else:#和for对齐,是python独有的语法如果for循环里的语句执行结束后执行else语句,如果for循环里有break则else后的语句不会执行。#print('%d 是个质数,请输入1个合数' %num)return Falsedef zhiyinshufenjie(num):nump = num#用于输出 90 = 2*3*3*5tmp = []if not zhishu(num):print('%num是个质数,请输入一个合数')#如果是质数则不用执行语句else:while num:#用于控制循环次数直到为0if not zhishu(num) and num != 1:#排除1,因为1在分解中没有意义tmp.append(num)num = 0else:for i in range(2, int(num**(1/2))+1):#num**(1/2)为了缩短计算范围,在计算超大数时有用if num % i == 0 & (not zhishu(i)):tmp.append(i)num = int(num/i) #print(i)break         #print(num) tmp = sorted(tmp)#排成有序数组#设置打印格式    str1 = ''for i in range(len(tmp)):if i== 0:str1= str1 + str(tmp[i])else:str1= str1 + '*' +str(tmp[i])returnstr = '%d = %s' % (nump,str1)return returnstr
numz = int(input("请输入一个正整数: "))
a=zhiyinshufenjie(numz)
print(a)

结果输出:

请输入一个正整数: 2345
2345 = 5*7*67Process finished with exit code 0

思路2:优化求解法,是在第一种思路下进行优化
第二种思路区别于第一种思路在于,第一个被整除的数永远是质数,比如1,2,3,5,7,如果是4和6那么也能被2整除。此时只需要不断更新被除后的数,就能计算出最终的质因数。此处还有几个小技巧,如保持除完以后还是整数,用//,在同一行打印,则设置print的参数为end=’’。

def fenjiezhiyinshu(num):n = num f = []for j in range(1,num//2+1):for i in range(2, n):if n % i == 0:f.append(i)n = n//ibreakif len(f) == 0:print("这是一个质数,请重新带入合数")else:f.append(n)f.sort()print('%d=%d'% (num,f[0]), end='')for i in range(1,len(f)):print('*%d'%f[i] ,end='')
百度百科的解法
# MillerRabin素数判定,结合Pollard_rho递归分解,效率极高
import random
from collections import Counterdef gcd(a, b):if a == 0:return bif a < 0:return gcd(-a, b)while b > 0:c = a % ba, b = b, creturn adef mod_mul(a, b, n):result = 0while b > 0:if (b & 1) > 0:result = (result + a) % na = (a + a) % nb = (b >> 1)return resultdef mod_exp(a, b, n):result = 1while b > 0:if (b & 1) > 0:result = mod_mul(result, a, n)a = mod_mul(a, a, n)b = (b >> 1)return resultdef MillerRabinPrimeCheck(n):if n in {2, 3, 5, 7, 11}:return Trueelif (n == 1 or n % 2 == 0 or n % 3 == 0 or n % 5 == 0 or n % 7 == 0 or n % 11 == 0):return Falsek, u = 0, n - 1while not (u & 1) > 0:k += 1u = (u >> 1)random.seed(0)s = 5for i in range(s):x = random.randint(2, n - 1)if x % n == 0:continuex = mod_exp(x, u, n)pre = xfor j in range(k):x = mod_mul(x, x, n)if (x == 1 and pre != 1 and pre != n - 1):return Falsepre = xif x != 1:return Falsereturn Truedef Pollard_rho(x, c):(i, k) = (1, 2)x0 = random.randint(0, x)y = x0while 1:i += 1x0 = (mod_mul(x0, x0, x) + c) % xd = gcd(y - x0, x)if d != 1 and d != x:return dif y == x0:return xif i == k:y = x0k += kdef PrimeFactorsListGenerator(n):result = []if n <= 1:return Noneif MillerRabinPrimeCheck(n):return [n]p = nwhile p >= n:p = Pollard_rho(p, random.randint(1, n - 1))result.extend(PrimeFactorsListGenerator(p))result.extend(PrimeFactorsListGenerator(n // p))return resultdef PrimeFactorsListCleaner(n):return Counter(PrimeFactorsListGenerator(n))PrimeFactorsListCleaner(1254000000)
参考文档:
1、#作者:不分享的知识毫无意义
#链接:https://www.jianshu.com/p/d37745fe3cdd
#来源:简书
2、#百度百科: https://baike.baidu.com/item/%E5%88%86%E8%A7%A3%E8%B4%A8%E5%9B%A0%E6%95%B0

python学习每日一题【20200226】python实现“分解质因数”的计算相关推荐

  1. python学习之第一课时--初始python

    python学习之第一课时--初始python Python前世今世 python是什么 python是一门多种用途的编程语言,时常在扮演脚本语言的角色 python流行原因 软件质量 提高开发者效率 ...

  2. python自学网站有哪些-Python学习网站有哪些?Python基础教程网站推荐

    Python学习网站有哪些?Python基础教程网站推荐:菜鸟教程.PHP中文网.PHP中文网.W3C.Reddit.博学谷.python中文学习大本营.Python 3 Module of the ...

  3. Python学习入门2:Python学习路线(课程大纲+Python视频教程+下载地址)

    Python学习路线(课程大纲+Python视频教程+下载地址) 目前Python已经成为最受欢迎的程序设计语言之一.Python的设计哲学是"优雅"."明确" ...

  4. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

  5. python学习课程 0基础学Python视频教程

    python学习课程,零基础Python初学者应该怎么去学习Python语言编程?python学习路线这里了解一下吧.想python学习课程?学习路线网免费下载海量python教程,上班族也能在家自学 ...

  6. python学习笔记(一)Python 简单介绍

    Python学习笔记(一)Python 简单介绍 Python介绍 Python简介 Python应用领域 Python是解释型的语⾔ 编译和解释的区别是什么? 编译型vs解释型 编译型 解释型 Py ...

  7. Python学习笔记(二)——Python基本图形绘制

    Python学习笔记(二)--Python基本图形绘制 文章目录 Python学习笔记(二)--Python基本图形绘制 不同编程语言的初心和适用对象 Python蟒蛇绘制 五星红旗绘制 这次笔记主要 ...

  8. python语言提供的3个基本数字类型是什么_计算机二级python学习教程(3) python语言基本数据类型...

    本文继续计算机二级python教程的学习,之前已经学习过了计算机二级python学习教程(1) .计算机二级python学习教程(2) 3.1 数字类型 数字类型:整数类型.浮点数类型.复数类型. 整 ...

  9. 电动力学每日一题 2021/10/15 Fourier变换法计算均匀电流密度产生的磁场

    电动力学每日一题 2021/10/15 Fourier变换法计算均匀电流密度产生的磁场 无限长均匀电流 无限长圆柱面均匀电流密度 无限长均匀电流 假设z轴上有一根非常细的电线,携带均匀电流I0I_0I ...

最新文章

  1. 互联网寒冬前端社招面试
  2. shell 死循环if判断_运维小技巧(2):shell函数
  3. win10下安装tensorflow-gpu==1.11.0的详细教程
  4. multiprocessing python_Python多进程运行——Multiprocessing基础教程1
  5. XCTF_Web_新手练习区:robots
  6. ffmpeg抓取rtsp流并保存_详细解析RTSP框架和数据包分析(1)
  7. 笔记 | 《机器学习》中特征选择与稀疏学习
  8. 小孩子要学习时间管理吗
  9. 开源中国正式挂牌,新三板首家软件众包平台
  10. U盘 安装 WIN7 ISO
  11. 高手进阶!终极内存技术指南
  12. 【转】Java中斜杠和反斜杠的替换
  13. MATLAB有趣或有用小程序合集
  14. linux开机到登陆的流程图,Linux开机自动登录root,并启动应用程序
  15. JanusGraph ,生产环境安装
  16. 3D dungeon(BFS)
  17. php两个时间相差月数,计算两个日期之间相隔的月数
  18. 人力资源管理如何借助数字化提升人效比?
  19. 基于simulink的飞轮储能发电系统仿真
  20. C练题笔记之:Leetcode-1455. 检查单词是否为句中其他单词的前缀

热门文章

  1. 旅游公寓APP开发特点
  2. Java中如何保证线程安全性
  3. Silverlight游戏特效开发(一) : 制作人物光环效果
  4. matlab的imshow python中cv2.imshow及plt.imshow相关测试
  5. 软件测试工程师笔试题
  6. 在vue项目中使用html2canvas截图(固定区域截图)
  7. linux-alpine安装软件使用指定安装源
  8. 美国计算机专业大学排名前30,【最新】2015年美国大学计算机专业排名
  9. 怎样控制键盘按键自动填写网页表单
  10. ubuntu下配置msmtp+mutt发送邮件