算法例子:质因数分解算法不同编程语言有不同的差异,但本质上都相同,都有着流程控制语句和循环、加减乘除运算等,都是通过批量处理来完成重复性的工作。一门好的语言要符合人性,让人使用起来顺手,还不容易出错,写的代码还易于维护和扩展,同时运行速度要足够快。这个世界上并没有完美的语言,不同语言在不同环境下有着不同的优势。以下让我们通过一个算法实例来理解不同语言之间的差异。
我们通过这个算法例子来简单弄明白各语言之间的差异,以下给出的是部分实现代码,更详细代码需要查看源文件。
首先什么是质因数分解算法?即任意一个合数可以分解为多个质数相乘。
例如:20 = 2 * 2 * 5; 45 = 3 * 3 * 5; 210 = 2 * 3 * 5 * 7
按数学运算:列竖式或左右分解,拿能被整除的最小的质数做除数,不断整除得到新的得数,最后把所有的除数和最后的得数连起来就是。
质因数分解图例
代码实现思路:- 先设立一个除数,从最小的质数开始,也就是2;
- 当能够被当前除数整除时,该除数就是因数,将原数字设为被整除后的结果;
- 继续从该除数开始整除新的结果,并不断循环;
- 当无法被整除时,则递增得到新的除数,继续第2步;
- 直到除数的平方大于要分解的值,终止循环。 最后所有的除数与剩下的大于1的那个得数就是分解结果。
一、C语言
C语言是面向过程的静态编译型语言,也是一切高级语言的鼻祖,可以说如今几乎所有流行的语言都有C语言的影子。C语言在底层开发,包括操作系统、驱动、中间件、图形库、数据库、网络库等开发等有着无可替代的作用。
C语言的生命力也是最长的,流行了近50年,至今还是开发排行榜前3的位置。C语言足够简洁清晰,没有那么多概念,也没有那么多API,性能极好,它是所有编程人员都应该掌握的语言,可以作为计算机基础来学。
C语言代码实现如下,该factorize可以返回一个分解后的数组。从代码里可以看出,首先需要申请一个动态数组result,长度为len的内存空间。该数组用来保存分解数,每分解出一个数字时则追加到数组中去,数组下标也随之增加。当分解完成后,最后返回分解数的数组。
代码逻辑:- 建立双循环,自最小的质数2开始不断递增遍历。
- 外层循环为是否继续分解的条件,当i的乘方小于等于要分解的数字时,说明还可以分解。i不断递增,直到i的平方大于num为止。
- 内循环则不断用num来除以约数,看能否除尽,能除尽则以得数作为新的num来继续分解,并将刚才的除数i追加到分解结果中。当i无法整除num时,说明当前i分解完成,则跳出内循环。
- 当循环终止后,最后分解的得数如果小于i的平方就没法继续分解,如果i大于1那剩下的num就是最后一个分解数。
二、C 语言
C 语言是C语言的超集,它扩充和完善了C语言。增加了类的概念,并引进了运算符重载、引用、虚函数等。C 做什么都离不开对象和类,其核心思想是多态,继承,封装。C 的语法与C几乎一致,基本上C的代码可以在C 下运行,但是C 比C语言要复杂和更难掌握,相对来讲C更加清晰易懂。
由于C语言相对简单,且是过程式,开发大型复杂系统或者大型软件界面时会力不从心,于是C 应运而生。其实我并不觉得C 比C好或强大,大型系统完全可以通过自己组织代码来得到良好架构,也有很多单独C语言UI库。
C 的生命力也很强大,几乎是很多中大型系统、游戏、桌面软件、服务端、网络通信等的首选语言,至今也在开发排行榜前5的位置。
这里C 代码实现与C语言一致,因为没有用到面向对象,所以没有任何区别。其他差异可以从GitHub仓库里查看。