python学习每日一题【20200226】python实现“分解质因数”的计算
题目:
每日一练(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实现“分解质因数”的计算相关推荐
- python学习之第一课时--初始python
python学习之第一课时--初始python Python前世今世 python是什么 python是一门多种用途的编程语言,时常在扮演脚本语言的角色 python流行原因 软件质量 提高开发者效率 ...
- python自学网站有哪些-Python学习网站有哪些?Python基础教程网站推荐
Python学习网站有哪些?Python基础教程网站推荐:菜鸟教程.PHP中文网.PHP中文网.W3C.Reddit.博学谷.python中文学习大本营.Python 3 Module of the ...
- Python学习入门2:Python学习路线(课程大纲+Python视频教程+下载地址)
Python学习路线(课程大纲+Python视频教程+下载地址) 目前Python已经成为最受欢迎的程序设计语言之一.Python的设计哲学是"优雅"."明确" ...
- Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级
前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...
- python学习课程 0基础学Python视频教程
python学习课程,零基础Python初学者应该怎么去学习Python语言编程?python学习路线这里了解一下吧.想python学习课程?学习路线网免费下载海量python教程,上班族也能在家自学 ...
- python学习笔记(一)Python 简单介绍
Python学习笔记(一)Python 简单介绍 Python介绍 Python简介 Python应用领域 Python是解释型的语⾔ 编译和解释的区别是什么? 编译型vs解释型 编译型 解释型 Py ...
- Python学习笔记(二)——Python基本图形绘制
Python学习笔记(二)--Python基本图形绘制 文章目录 Python学习笔记(二)--Python基本图形绘制 不同编程语言的初心和适用对象 Python蟒蛇绘制 五星红旗绘制 这次笔记主要 ...
- python语言提供的3个基本数字类型是什么_计算机二级python学习教程(3) python语言基本数据类型...
本文继续计算机二级python教程的学习,之前已经学习过了计算机二级python学习教程(1) .计算机二级python学习教程(2) 3.1 数字类型 数字类型:整数类型.浮点数类型.复数类型. 整 ...
- 电动力学每日一题 2021/10/15 Fourier变换法计算均匀电流密度产生的磁场
电动力学每日一题 2021/10/15 Fourier变换法计算均匀电流密度产生的磁场 无限长均匀电流 无限长圆柱面均匀电流密度 无限长均匀电流 假设z轴上有一根非常细的电线,携带均匀电流I0I_0I ...
最新文章
- 互联网寒冬前端社招面试
- shell 死循环if判断_运维小技巧(2):shell函数
- win10下安装tensorflow-gpu==1.11.0的详细教程
- multiprocessing python_Python多进程运行——Multiprocessing基础教程1
- XCTF_Web_新手练习区:robots
- ffmpeg抓取rtsp流并保存_详细解析RTSP框架和数据包分析(1)
- 笔记 | 《机器学习》中特征选择与稀疏学习
- 小孩子要学习时间管理吗
- 开源中国正式挂牌,新三板首家软件众包平台
- U盘 安装 WIN7 ISO
- 高手进阶!终极内存技术指南
- 【转】Java中斜杠和反斜杠的替换
- MATLAB有趣或有用小程序合集
- linux开机到登陆的流程图,Linux开机自动登录root,并启动应用程序
- JanusGraph ,生产环境安装
- 3D dungeon(BFS)
- php两个时间相差月数,计算两个日期之间相隔的月数
- 人力资源管理如何借助数字化提升人效比?
- 基于simulink的飞轮储能发电系统仿真
- C练题笔记之:Leetcode-1455. 检查单词是否为句中其他单词的前缀