Python3 初学实践案例(11)判断质数以及计算一个数字的质因数

昨天晚上看到群里有人问如何计算质因数,我想了一下,实现了这个计算质因数的脚本。质因数(素因数或质因子)在数论里是指能整除给定正整数的质数。除了1以外,两个没有其他共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质。正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以用指数表示。根据算术基本定理,任何正整数皆有独一无二的质因子分解式[1] 。只有一个质因子的正整数为质数。

举例:10 = 2 * 5; 8 = 2 * 2 * 2; 9 = 3 * 3

好,知道了具体的概念,我们就开始时间代码:

计算一个数字的质因数完整代码#!/usr/bin/env python3

# -*- coding: UTF-8 -*-

import sys

# 判断一个数字是否为质数

def isPrime(n):

if n <= 1:

return False

i = 2

while i*i <= n:

if n % i == 0:

return False

i += 1

return True

# 计算一个数字的质因数

def calc(num):

i = 2

while i*i <= int(num):

#for i in range(2,int(num**0.5) + 1):

if num%i == 0:

arr.append(i)

if isPrime(num/i):

arr.append(int(num/i))

else:

calc(num/i)

break

i += 1

# 输入数字

def checkInput():

num = len(sys.argv) > 1 and sys.argv[1] or input('输入: ')

while not num.isdigit():

print('输入的内容必须是正整数哦!')

num = input('输入: ')

return int(num)

# 输出结果

def echo(num, a):

res = '数字 '+str(num)+' 的质因数结果是: '

if len(a) == 0:

res += str(num)

else:

res += str(a)[1:len(str(a))-1].replace(', ','*')

print(res)

# 主函数

if __name__ == '__main__':

print('这是一个计算一个数字的质因数的程序\n请输入您要计算质因数的数字')

num = checkInput()

arr = []

calc(num)

echo(num, arr)

重点解析

判断数字是否为质数

计算质数的关键是要减少运算量。如果傻呢,就从1循环到这个数字来进行全量循环计算。聪明一点就不需要了,只需要循环到这个数字的平方根的数字即可。

我之前在 js 中就是这么干的。上面的代码我是从网上找到的,仔细看了一下,这段代码真的是绝顶聪明。因为循环到平方根,和循环数字用乘法递增,显然后者的运算量要小很多。

重点代码:while i*i <= n:

if n % i == 0:

return False

i += 1

实际体验下来,确实计算效率非常非常高!然后我把计算质因数也改成了这种乘法运算,抛弃了原来的计算平方根的算法。

检查输入是否为数字

在第一步中,我们就需要用户输入一个数字。这里我们使用 python 自带的 input 方法获取用户的输入。但是用户输入的不一定是一个数字,所以需要进行校验,如果不正确的话,就必须重新输入。

一开始我是用的递归的方式来进行处理,但是发现这样如果 return 处理不好就会很麻烦。所以改变了思路,使用 while 来进行处理,果然简单了很多。

and or 用法

这个脚本允许你直接在脚本后面缀上数字来进行直接运算,也可以先进入脚本,然后输入数字进行运算,最重要的就是这个 and or 的使用:num = len(sys.argv) > 1 and sys.argv[1] or input('输入: ')

如果有传参,则使用传参,如果没有传参,则让用户输入一个参数。传参和输入,是使用的同一个校验脚本。

有点类似于三元运算,但是又不是。

字符串的截取与替换

python 的字符串的截取实在是太方便了。string[1,5]

简单方便不用记忆。

而在替换方面和 js 是差不多的。都是 replace 方法。

计算质因数本身没什么特别的,只是利用了一个数组来存放这个它的质因数。算法比较简单,就不做另外的说明了。

最后,看下执行结果以及运算效率:

上图是几个很小的数字的运算的结果,顺便演示了传参和后输入数字的结果。

从结果我们可以看到这个质数是非常大的,但是运算还是很快就结束了。

我没有再使用命令行处理库来更加完善这个脚本,因为目前这个样子已经非常精简非常好用了。

python判断互质_Python3 判断质数以及计算一个数字的质因数相关推荐

  1. CCF NOI1028 判断互质

    问题链接:CCF NOI1028 判断互质. 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 输入两个正整数m和n,判断m和n是否互质(即最大公约数为1),是则输出Yes,否则 ...

  2. C语言程序编写如何判断互质,CCF NOI1028 判断互质

    时间限制: 1000 ms  空间限制: 262144 KB 题目描述 输入两个正整数m和n,判断m和n是否互质(即最大公约数为1),是则输出Yes,否则输出No. 输入 输入两个整数m和n,中间用空 ...

  3. python 计算数字位数,Python | 计算一个数字的总位数

    先决条件: Python中的二进制数系统 给定一个数字,我们必须使用Python查找二进制值的总位数来表示该数字. 示例 Input: num = 61 Binary value of 61 is = ...

  4. c语言 判断互质,[经典算法] 找出某数以内与其互质的数

    起因:前几天做了一个这样的题目,感觉自己变成了一个智障,来写写算法: 相关定义: ①质数定义:没有除 '1' 以外的因子的数就是质数.如:1.3.5.7.11等等. ②互质定义:两个数之间除 '1'  ...

  5. java判断两个数互质_AcWing 458. 比例简化-java(无需判断互质)

    因为数据范围很小,这道题的基本思路就是枚举所有的A'和B',找出最小的那个. 枚举需要满足下面两个条件 1.A'和B'互质 2.A'/B'的比例大于等于原来的比例,并且尽可能接近. 其实这里无需判断A ...

  6. python统计列表中元素个数_python中计算一个列表中连续相同的元素个数方法

    python中计算一个列表中连续相同的元素个数方法 最简单的例子: a = [1,1,1,1,2,2,2,3,3,1,1,1,3] # 问:计算a中最多有几个连续的1 很明显,答案是4 如果用代码实现 ...

  7. python判断互质_整数判断是否互质并求逆元的 python 实现

    标签: 算法来自<密码学原理与实践>page129 #!/usr/dev/python #-*- coding:utf-8 -*- ''' Extended Euclidean algor ...

  8. python获取字符串第一个字母_Python3基础 字符串 capitalize 返回一个新的字符串,它的第一个字母大写...

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体. ------------------------------------- ...

  9. 【数论】 质数知识总结(质数判断、筛选、质因子分解、互质)

    文章目录 一.定义 二.质数的判断 三.质数的筛选 四.质因子分解 五.互质 一.定义 质数,又称素数,若一个正整数无法被除了1和它自身以外的其它数整除,则称其为质数,否则为合数.特殊地,1既不是合数 ...

  10. python判断两个数是否互质_《算法》第一章——判断两个整数是否互质

    判断两个整数互质的方法 概念:公约数只有1的两个数叫做互质数.根据互质数的概念可以对一组数是否互质进行判断.如:9和11的公约数只有1,则它们是互质数. 求商判断法:用大数除以小数,如果除得的余数与其 ...

最新文章

  1. python os system用法_Python调用系统命令os.system()和os.popen()的实现
  2. #mysql50#_#mysql50#.ssh设个啥数据库?
  3. Python -bs4反爬虫解决方法
  4. OpenCV伪彩色applyColorMap函数
  5. jq之hide(1000)
  6. hadoop开启后jps只有jps一个进程
  7. 荐一个不错的UI设计网站: uimaker
  8. 微信开发者工具之WXS和简单组件
  9. yum源的三种配置方式
  10. 用K-Means和DBSCAN算法对西瓜数据集4.0进行聚类分析
  11. Python3网络爬虫(十四):跟股神巴菲特学习炒股之财务报表入库(MySQL)
  12. 全球及中国浴用纺织品行业商业模式分析及投资风险预测2022年版
  13. win7访问XP或者2003共享,提示密码错误的解决办法
  14. 微信小程序实现跳转到另外一个小程序的方法
  15. Android常用控件有哪些?如何使用?
  16. android控制台字体大小设置,Android studio 4.1 豆沙护眼色配置、字体大小设置、内存大小设置...
  17. ailx10的hacknet攻略005
  18. 图片大小自适应垂直居中的方法
  19. HR推荐:应届生简历制作的细节
  20. CDN是什么?为什么要使用CDN?

热门文章

  1. 虚拟服务器防病毒,windows 2008 Hyper-v虚拟化防病毒
  2. 三口烧瓶规格有哪些_三口烧瓶有哪些规格,用途是什么 | | 化工资讯网
  3. Android TextView设置下划线
  4. 360极速模式版本,出现已经取消网页导航现象,怎么解决呢?
  5. 大数据文本相似去重方案
  6. 学习pytorch中归一化transforms.Normalize
  7. 想要成功,你得像剥洋葱一样一层一层地撕开自己
  8. 【网络是怎么连接的】| 【03】探索集线器、交换机和路由器
  9. 技术干货 | 如何用MindSpore优化器加速收敛高度逼近最优值?
  10. linux远程灰屏,解决配置Ubuntu中vnc远程显示灰屏