| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 基础练习 分解质因数 -> 正文阅读 |
|
[数据结构与算法]基础练习 分解质因数 |
基础练习 分解质因数 Description 求出区间[a,b]中所有整数的质因数分解。2<= a,b <=10000 Input 输入描述: 输入两个整数a,b。 2<= a,b <=10000 输入样例: 3 10 Output 输出描述: 每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例) 输出样例: 3=3 4=2*2 5=5 6=2*3 7=7 8=2*2*2 9=3*3 10=2*5 题目来源:OnlineJudge
?题目要求分解成质因数形式,其实就是将一个数n通过除法逐步分解,除数从2开始遍历到n。如果可以整除,那么除数就是一个质因数,下一次以所得商作为要分解的数据进行重复上面分解过程直到最终的商为0结束;如果除数遍历n仍未出现可以整除n的除数,那n就是最后一个质因数。但是这里我们要思考一个问题,每一次除数都是从2开始到n结束,且n在此过程中可能会发生变换,怎样设计这里的算法呢? 首先,这里我们知道应该有两个循环,一个判断n是否为0;一个对除数从2到n进行遍历,所以有以下算法:
该算法中,while循环控制分解条件,当i!=n时继续n进行分解处理,直到i==n结束。这个还是很好理解的,实现了每次判断除数都从2到n进行遍历,也实现了分解一次后对n进行更新。但该算法仍存在效率的问题,我们不妨模拟一下上述分解100的整个过程,如下所示:
从上面过程中,我们可以分析,每用n/=i更新一次n后,下一次除数都从2至n-1开始遍历,但我们直到,更新后的n是不可能再被小于上一个输出的i的数整除的,这里造成了资源浪费,下面将代码优化,提高效率,如下:
这里换了一种思路,只遍历一次2到n的数,在for循环里面利用while循环分解n(当i<n时进行判断分解)。如果i<n,进入while判断分解,如果n%i==0,输出i*,更新n=n/i,继续进行判断分解,除数仍是i;如果n%i!=0,break跳出while循环,i自增1,继续进行上述操作。我们看到n的改变,也会影响外重for循环判断条件的改变,但最终结束情况其实就是n已经是一个质数,不能分解,最后输出即可。最终的情况,如果以while来判断,当i自增到i==n时,并不进入while循环,也就是不执行打印语句和更改n的语句,n不再改变,跳过for循环后,i自增1;这时,在for循环判断条件中i>n,不满足条件,跳出for循环,意味着分解过程结束,n是一个质数,不能再分解,输出最后的n即可。 分析到这里,解决本题的核心算法已经基本理清。
1.首先从一个最小的质数i=2开始,最小的质数为2
?本篇blog主要是我对C语言OJ作业的题目总结,后续还会继续更新其他题目。如果篇目中有解释得不够清楚的地方或者读者有更好的算法,我们可以在评论区交流,让我们继续完善这篇blog,同时也可以帮助我下次写出更好的blog。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/10 2:30:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |