最新要闻
- 今亮点!霸道女总裁加盟《碟中谍8》
- 天天播报:00后男生每天下班后卖烤肠解压 50元投资日赚200元:厌恶刷视频、打游戏
- 环球微速讯:比进口价格便宜!海南三亚榴莲今年6月将大规模上市
- 当废物挺好?委员称年轻人想躺平更多是调侃 奋斗的是大多数
- 天天亮点!中国足彩网竞彩11日推荐:曼城取胜无悬念
- 当前播报:amusements
- 环球热议:6月上映!《变形金刚7》角色海报发布:擎天柱、猩猩队长亮相
- 【速看料】降价潮席卷全国 车企尽数参战是为何?乘联会解答:国六B要来了
- 环球今热点:真正油电同价!比亚迪投放“深水炸弹”:13.4万买宋Pro DM-i超级混动
- 环球通讯!立春来首场寒潮横扫我国大部:多地将遭遇滑梯式降温 最高降20℃
- 【新要闻】活久见!女生家中发现神奇圆柱形手机:登QQ、手电筒、拍照 功能多到炸
- 最便宜竖折叠继任者!摩托罗拉Razr 2023真机图出炉:首次拼色后壳
- 当前快报:汽车价格战新进展:南北大众同日入局 丰田买一辆送一辆
- 【时快讯】《满江红》中国影史票房榜第6:力压《唐人街探案3》 票房突破45.23亿
- 环球即时:2023开门红!长四丙成功发射“一箭双星”
- 环球消息!第一批PCIe 5.0 SSD都是残血!14GB/s满血版还早呢
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【质因数分解算法详解】C/Java/Go/Python/JS/Dart/Swift/Rust等不同语言实现
关于质因数分解算法的不同语言实现,通过实例来看不同语言的差异
什么是质因数算法?
即任意一个合数可以分解为多个质数相乘。例如:
20 = 2 * 2 * 5 45 = 3 * 3 * 5210 = 2 * 3 * 5 * 7520 = 2 * 2 * 2 * 5 * 13
按数学运算:列竖式或左右分解,拿能被整除的最小的素数做除数,不断整除得到新的得数,最后把所有的除数和最后的得数连起来就是。
算法基本思路
除数的平方小于等于被分解数时,说明可以分解。除数从最小的质数2开始,不断递增,直到无法分解。
(资料图)
- 先从最小的质数2开始整除被分解数
- 当能够整除时,说明分解成功,将整除后的得数作为新被分解数继续分解
- 继续从2开始整除,如果2无法整除,则递加到新的质数作为除数
- 直到将数字分解完,也就是递增数的平方大于被分解数时为止
代码实现思路
- 先设立一个除数,从最小的质数开始,也就是2;
- 当能够被当前除数整除时,该除数就是因数,将原数字设为被整除后的结果;
- 继续从该除数开始整除新的结果,并不断循环;
- 当无法被整除时,则递增除数,得到新的除数,继续第2步;
- 直到除数的平方大于要分解的值,终止循环。
最后所有能整除的除数与最后的大于1的无法分解的得数就是结果。
不同语言的特点
我们通过一个算法例子来搞明白各语言之间的差异,以下给出部分实现代码,详细代码需要查看源文件。
C语言
C语言代码实现如下,该factorize可以返回一个分解后的数组。从代码里可以看出,首先需要申请一个动态数组result,长度为len的内存空间。该数组用来保存分解数,每分解出一个数字时则追加到数组中去,数组下标也随之增加。当分解完成后,最后返回分解数的数组。factor.c
int *factorize(int num, int len) { int *result = (int *)malloc(len * sizeof(int)); int i = 2; int result_idx = 0; // i的平方小于该数字,说明可以继续分解 while (i * i <= num) { // 如果可以被i整除,则说明i是因数,继续以i分解 while (num % i == 0) { result[result_idx] = i; // 每分解一次,原数值就赋值为除以i的结果 num /= i; // 每增加一个因数,数组下标右移,以便追加到结果中 result_idx++; } // 当无法被i整除时,i递增继续分解 i++; } // 最后的分解数如果大于1说明上一次整除不是自身,即是最后1个因素 if (num > 1) { result[result_idx] = num; } return result;}
代码逻辑:
- 建立双循环,自最小的质数2开始不断递增遍历。
- 外层循环为是否继续分解的条件,当i的乘方小于等于要分解的数字时,说明还可以分解。i不断递增,直到i的平方大于num为止。
- 内循环则不断用num来除以约数,看能否除尽,能除尽则以得数作为新的num来继续分解,并将刚才的除数i追加到分解结果中。当i无法整除num时,说明当前i分解完成,则跳出内循环。
- 当全部分解后,有的情况下最后的得数刚好被质数除尽,最后的得数为1,有的情况则质数的平方大于得数,终止了循环,此时该得数大于1,就是最后的因数。
C++语言
C++代码实现与C语言一致,因为没有用到面向对象,所以没有任何区别。factor.cpp
int *factorize(int num, int len) { int *result = (int *)malloc(len * sizeof(int)); int i = 2; int result_idx = 0; while (i * i <= num) { while (num % i == 0) { result[result_idx] = i; num /= i; result_idx++; } i++; } if (num > 1) { result[result_idx] = num; } return result;}
Java语言
java版使用了ArrayList,是长度可变的列表,相比c语言使用数组来讲要方便些。代码上基本一样,如果也使用int数组,那代码就一模一样了。Factor.java
class Factor { public static Listfactorize(int num) { int i = 2; List result = new ArrayList<>(); while (num > i * i) { while (num % i == 0) { result.add(i); num /= i; } i++; } if (num > 1) { result.add(num); } return result; }}
JavaScript语言
JavaScript语言的数组没有类型,也无需指定长度,使用起来非常简单易懂。整个代码写法与java版本如出一辙。factor.js
function factorize(num) { let i = 2 const result = [] // 如果因数的平方小于该数字,说明可以继续分解 while (i * i <= num) { // 从小到大逐个往上递增,当遇到能被整除时取出该因数 while (num % i === 0) { result.push(i) // 除以因数之后得到的数再去分解 num = num / i } i++ } // 最后的分解数如果大于1说明无法除尽,即是最后1个因素 if (num > 1) { result.push(num) } return result }
TypeScript语言
typescript是JS的一个变种或者称之为超集,完全兼容js语言,最后会编译成js来执行。主要是基于类、强类型,写法上与js几无差异。当然也可以不按类的方式来写。PrimeFactor.ts
class PrimeFactor { num: number; result: Array; constructor(num: number) { this.num = num; } factorize() { let i = 2; this.result = []; let num = this.num; while (i * i <= num) { while (num % i === 0) { this.result.push(i); num /= i; } i++; } if (num > 1) { this.result.push(num); } }}
Python语言
python是面向对象语言,与java不同,方法也可以脱离于类存在。看python代码,可以说是最简单明了的,可以说最易懂。与js一样,python也是动态脚本语言,数组也是动态可变的,非常好用。其实python与js也很像,只是相比js来讲,是强类型的(当然也不是严格意义的强类型,这点与ts很像)。factor.py
def factorize(num): i = 2 result = [] while (num >= i * i): while (num % i == 0): result.append(i) num = num / i i = i + 1 if (num > 1): result.append(num) return result
Go语言
go语言不以类为依赖,起语言简练,语法上是c和js的混合体,变量声明也是var。数组空间也需要提前申请。无需括号和分号,相对比较简洁。从这段代码来看与c差异不大,本质上是c的变体。factor.go
func factorize(num int, len int) []int { var result = make([]int, len) var i int = 2 var resultIdx int = 0 for i*i <= num { for num%i == 0 { result[resultIdx] = i num /= i resultIdx++ } i++ } if num > 1 { result[resultIdx] = num } return result}
Kotlin
kotlin是java的一种语法糖,是完全兼容java语法的,最后也会变成class来执行。在Kotlin 中没有原始类型,一切都是对象。参数参数一旦将值分配给val,就无法更改。如果想重新分配它,则必须将其声明为var,而在Kotlin的方法中,参数隐式声明为final val,也无法更改参数。因此,这里将number赋值给变量num。factor.kt
fun facorize(number: Int): List{ val result = ArrayList (); var i = 2; var num = number; while (i * i <= num) { while (num % i == 0) { num = num / i; result.add(i); } i++; } if (num > 1) { result.add(num); } return result;}
Dart
dart是支持即时编译和提前编译的语言,语法与js基本上一致,只不过需要提前编译并且严格类型。但在实际使用上与js可谓非常接近,熟悉js或ts的开发者上手几乎0成本。这里取整除法与其他语言略有不同,如果不加~则得到小数了。factor.dart
List factorize(int num) { // Listresult = []; var result = []; int i = 2; while (i * i <= num) { while (num % i == 0) { num = num ~/ i; result.add(i); } i++; } if (num > 1) { result.add(num); } return result;}
Swift
swift是苹果推出的旨在替代Objective-C进行App开发的语言。从语法上跟js非常像,var声明,function第一型,与go也很类似,还不要分号,function缩写为func。从语言趋势上看,c+java+js的结合体会是大势所趋。尤其是类js,几乎所有最新的语言都在学习js的优点,当然都摒弃了js弱类型的特点。从swift看数组声明非常简单,无需指定长度,不断append即可。factor.swift
func factorize(num: Int) -> [String] { var result = [String]() var num = num var i = 2 while (i * i <= num) { while (num % i == 0) { result.append(String(i)) num = num / i } i += 1 } if (num > 1) { result.append(String(num)) } return result}
Objective-c
OC是苹果原生的开发语言,来自于c语言,就像windows里面的VC++一样。但说实话OC的语法看起来不是很友好,从变量声明到对象调用,看起来与其他语言不是很一致,但总体上来也是类c的,所以本质上还是一样。数组要申请分配空间,长度无需指定。数组操作和对象引用的写法上与其他差异较大,但总体结构差异不大。factor.m
@interface Factor : NSObject- (NSArray*)factorize:(int)num;@end@implementation Factor- (NSArray*)factorize:(int)num{ // NSMutableArray *arr = [NSMutableArray arrayWithCapacity: 100]; NSMutableArray *arr = [[NSMutableArray alloc] init]; int i = 2; int resultIdx = 0; while (i * i < num) { while (num % i == 0) { [arr addObject: [NSNumber numberWithInt: i]]; // NSLog(@"%d" @"=" @"%d", i, resultIdx); resultIdx++; num /= i; } i++; } if (num > 1) { [arr addObject: [NSNumber numberWithInt: num]]; NSLog(@"%d", num); } return arr;}@endint main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hi, this is about factor algorithm by Objective-C"); // Factor *factor = [[Factor alloc] init]; Factor *factor = [Factor new]; int num = 120; NSArray *arr = [factor factorize: num]; NSLog(@"%@", arr); // echo NSLog(@"%d = ", num); for (id obj in arr) { NSLog(@"%@ *", obj); } // echo printf("%d = ", num); for (int i = 0; i < [arr count]; i++) { if (i != 0) { printf(" * "); } printf("%d", [arr[i] intValue]); } } return 0;}
Rust
Rust最初是由Mozilla研究院提出,后经多方改良,于2015年正式发布。Rust的语法和C、C++非常类似,它的目标就是替代C和C++。
Rust的目标是高安全、高性能、高并发。Rust抛弃了影响性能的垃圾回收器,通过变量所有权的方式来自动释放内存。同时提供多线程支持且是内存安全的。
Rust 虽然没有没有专门的class来声明对象,但它支持面向对象。Rust可通过结构体来定义类,再通过impl来实现。在 Rust 中虽没有extends,但可以通过特性(trait)实现多态。
Rust从语法上足够精炼,风格比较像普通的高级语言,提供的元组(Tuple)和动态数组(Vector)、切片(Slice)模式非常方便,没有C/C++操作数据那么繁琐,但同时其又保持了底层语言的优越性能,能看得出来Rust是牛人精心打造的。所以未来,很可能Rust会取代C、C++以及Go和Java。
fn factorize(mut num: i32) -> Vec{ let mut i = 2; let mut v: Vec = Vec::new(); while i * i <= num { while num % i == 0 { println!("{:}", i); num = num / i; v.push(i); } i += 1; } if num > 1 { println!("{:}", num); v.push(num); } return v;}fn main() { println!("factorize:"); let mut num = 20; println!("number is: {:}", num); let v: Vec = factorize(num); println!("{:?}", v); num = 140; println!("number is: {:}", num); let v: Vec = factorize(num); println!("{:?}", v); num = 120; println!("number is: {:}", num); let arr = factorize(num); println!("{:?}", arr);}
源码
不同语言实现质因数分解算法代码:https://github.com/microwind/algorithms/tree/main/factor
更多算法代码,请收藏:https://github.com/microwind/algorithms
关键词:
-
【质因数分解算法详解】C/Java/Go/Python/JS/Dart/Swift/Rust等不同语言实现
关于质因数分解算法的不同语言实现,通过实例来看不同语言的差异什么是质因数算法?即任意一个合数可以...
来源: Shell命令-常用操作2
【质因数分解算法详解】C/Java/Go/Python/JS/Dart/Swift/Rust等不同语言实现
今亮点!霸道女总裁加盟《碟中谍8》
天天播报:00后男生每天下班后卖烤肠解压 50元投资日赚200元:厌恶刷视频、打游戏
【时快讯】网络安全(中职组)-B模块:Web安全渗透测试
环球新消息丨K8S 性能优化-K8S Node 参数调优
环球微速讯:比进口价格便宜!海南三亚榴莲今年6月将大规模上市
当废物挺好?委员称年轻人想躺平更多是调侃 奋斗的是大多数
天天亮点!中国足彩网竞彩11日推荐:曼城取胜无悬念
焦点短讯!使用SSM+Shiro+Layui框架,基于RBAC3模型开发的权限管理系统
snort入侵检测基础概述
当前播报:amusements
环球热议:6月上映!《变形金刚7》角色海报发布:擎天柱、猩猩队长亮相
【速看料】降价潮席卷全国 车企尽数参战是为何?乘联会解答:国六B要来了
观热点:01-C语言概述
环球今热点:真正油电同价!比亚迪投放“深水炸弹”:13.4万买宋Pro DM-i超级混动
环球通讯!立春来首场寒潮横扫我国大部:多地将遭遇滑梯式降温 最高降20℃
【新要闻】活久见!女生家中发现神奇圆柱形手机:登QQ、手电筒、拍照 功能多到炸
读Java性能权威指南(第2版)笔记13_堆内存下
最便宜竖折叠继任者!摩托罗拉Razr 2023真机图出炉:首次拼色后壳
当前快报:汽车价格战新进展:南北大众同日入局 丰田买一辆送一辆
世界速递!day05-功能实现04
Vue————Vue v2.7.14 入口文件【二】
【时快讯】《满江红》中国影史票房榜第6:力压《唐人街探案3》 票房突破45.23亿
环球即时:2023开门红!长四丙成功发射“一箭双星”
环球消息!第一批PCIe 5.0 SSD都是残血!14GB/s满血版还早呢
世界快资讯丨有了ChatGPT 动动嘴就能使唤Excel:我的童年梦想实现了
每日热门:8岁男孩单手打破汉诺塔世界纪录:4.305秒搞定4层
当前头条:海绵宝宝卡通图片线条图_海绵宝宝卡通图片
天生要完美电视剧28集完整版_天生要完美电视剧
对C++做爬虫的代码进行简单分析
世界热推荐:2.HelloSpring
孙海洋夫妇餐饮公司被列经营异常:本人回应
今日报丨香港男子深圳上班每天通勤4小时:月薪3万 每天通勤费用80元
【全球独家】63.C++类型转换
世界今亮点!python可变长参数
当前观察:大获成功!《最后生还者》成史上收视率最高的游戏改编剧
爆款椰子鞋停售后:阿迪在中国凉凉了
1.3kg下颜值、性能、屏幕全给你!华硕灵耀14 2023评测:续航惊人
观热点:长城汽车发布Hi4全新新能源技术:4驱享受 2驱能耗
全球关注:杠上比亚迪秦PLUS DM-i 新款日产轩逸上市:9.98万起
8GB、16GB显存的性能差多少?实测多达172%!
明解数据库------数据库存储演变史
AMD最强核显跑分上来了!但是还打不过GTX 1650 Ti
全球最新:买丰田bZ4X电动车 送一辆威驰轿车?4S店回应:活动属实
RTX 30公版显卡突然集体消失!刚刚降价40%
微头条丨公司规定不接董事长电话1次罚10000元 员工:试岗1天就走了
【全球快播报】校友承诺捐赠1100万元却不兑现被告 学校:他具备履约能力
紧跟微信步伐:支付宝掌纹支付设备外观专利获授权
【天天快播报】搅局中端市场!一加Ace2V评测:将16G满血内存进行到底
通讯!破壁机虚标功率后 疯狂小杨哥带货又翻车:面霜因虚假宣传被罚
《王者荣耀》出海“首战告捷”:登顶巴西免费游戏榜
环球报道:记录--vue3+setup+ts 知识总结
【世界速看料】程序员养发神器:拒绝加班熬夜,告别秃头!
【世界聚看点】【希尔排序ShellSort算法详解】Java/Go/Python/JS/C不同语言实现
环球微头条丨【分享贴】项目中为啥总是项目经理一人干着急?
使用PostgreSQL而不是MySQL存储中型数据有什么好处?
3000块多品牌SSD质量大PK:整体比机械硬盘可靠
玩家购入二手Switch主机:可是被卖家坑惨了
航班晚点1小时 机长提速提前20分钟到达帮助乘客换机?山航回应
每人1600元!北京发放首批“京彩·绿色”消费券:买手机PC都能用
当前热文:涉及121万辆!我国2022年新能源汽车召回量创历史新高:电池、电机缺陷多
环球最资讯丨暴风的恋人百度云_暴风的恋人
有监督学习——线性回归
禁用XXE处理漫谈
腾讯-广点通转化归因
来真的!贾跃亭:3月30日生产FF91 百万豪车来了
【天天新视野】30个汽车品牌降价 成都发放消费券:满40万可减8000元
【世界独家】华硕发布TUF Gaming M3 Gen II鼠标:仅重59g、IP56防尘防水
全球今亮点!过期1天的食物还能吃吗?
日系中的另类!国产马自达CX-50内饰发布:原汁原味引入海外版
加速资源整合,星纪魅族围绕手机、XR、前瞻技术拓展智能生态
Prompt-Engineering-Guide 学习摘要2
今日关注:电动汽车综合检测
观焦点:这几个群,程序员可千万不要进!
每日快讯!12万元买宝马“3系”?宝马中国回应降价传闻:指导价没变
当前快讯:玩家不满《魔戒:咕噜》新宣传片:他没有主角光环!
环球热讯:小米搞出“新花样”:可层叠摄像模组专利获授权
焦点快报!没有秘密了!AI或能够读取大脑重现梦境
今日快看!新老代表接力提建议将牡丹定为国花:100多个国家都有国花了
【天天报资讯】山西李家大院哪些人可以享受半价票优惠
环球新资讯:【机器学习】1. 广义线性模型
【世界新视野】密码学报如何正确Latex投稿?
环球今亮点!快 40 岁,刚被裁。。
金三银四每天一个.NET基础知识巩固(一)
今日要闻!从“13 天”到“0 天”延时,揭秘火山引擎 DataLeap SLA 保障最佳实践
世界热消息:谷歌报复性砸出5620亿参数大模型:比ChatGPT更恐怖 学术圈已刷屏
【环球播资讯】2月国产游戏出海成绩出炉:《原神》获收入和增长双料冠军
Nginx http 文件服务器 中文名称文件乱码以及不能访问下载问题 (解决全过程)
有关马的歇后语有哪些?有关马的古诗有哪些?
工科理科化现象亟待扭转!曹德旺等科学家企业喊话让学生去工厂一线真问题
【世界时快讯】委员喊话农村淘汰、封杀老头乐 网友吵翻:揭秘观点背后让人唏嘘?
隐婚男女的结局是什么?隐婚男女演员介绍
小学二年级班主任工作计划有哪些?小学二年级家长会发言稿
消防逃生的注意事项有哪些?消防逃生演练总结
旅游可持续发展的实质是什么?旅游可持续发展论文模板
英语六级考试时间安排分配是什么?英语六级考试题型简介
世界热头条丨虼蚤的读音是什么_虼蚤
描写景色的词语集锦有哪些?描写景色的段落摘抄
梁祯元为什么叫南韩贾宝玉?梁祯元为什么是队长?