博客
关于我
《算法笔记》学习日记——5.5 质因子分解
阅读量:222 次
发布时间:2019-02-28

本文共 3929 字,大约阅读时间需要 13 分钟。

目录

5.5 质因子分解

问题 A: 完数

题目描述

求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+3=6,那么6是完数。即完数是等于其所有因子相加和的数。
输入
测试数据有多组,输入n,n数据范围不大。
输出
对于每组输入,请输出1-n内所有的完数。如有案例输出有多个数字,用空格隔开,输出最后不要有多余的空格。
样例输入

6

样例输出

6

思路

这题似乎在学Python的时候也做过??(大概),总之也是很简单的思路,因为这里是因子,不是质因子,所以对每个1~n的数都寻找它的因子,每找到一个因子,就减去这个因子,如果找完所有因子之后,那个数被减为0,就说明这个数正好是个完数,于是输出即可。
最后记得要控制空格的输出,如果是第一个数,就直接输出,如果是后面的数(第二第三个)就先输出一个空格,再输出数。
代码

#include
#include
#include
#include
#include
#include
using namespace std;int main(){ int n; while(scanf("%d", &n) != EOF){ int cnt = 0;//记录有几个完数 for(int i=1;i<=n;i++){ //对1~n进行遍历 int temp = i;//把i暂存在变量temp里 for(int j=1;j

问题 B: 完数

题目描述

求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+3=6,那么6是完数。即完数是等于其所有因子相加和的数。
输入
测试数据有多组,输入n,n数据范围不大。
输出
对于每组输入,请输出1-n内所有的完数。如有案例输出有多个数字,用空格隔开,输出最后不要有多余的空格。
样例输入

6

样例输出

6

思路

这题和问题A一模一样(是真的一模一样,除了问题A变成问题B了),代码也相同,这里就不说了。
代码

#include
#include
#include
#include
#include
#include
using namespace std;int main(){ int n; while(scanf("%d", &n) != EOF){ int cnt = 0;//记录有几个完数 for(int i=1;i<=n;i++){ //对1~n进行遍历 int temp = i;//把i暂存在变量temp里 for(int j=1;j

问题 C: 质因数的个数

题目描述

求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<109)。
输出
对于每组数据,输出N的质因数的个数。
样例输入

120200

样例输出

55

提示

注意1不是N的质因数;若N为质数,N是N的质因数。
思路
这题和书上的PAT A1059 Prime Factors几乎一样,而且PAT那道题给的是int范围的整数,这题还要小一点(int最大差不多到2×109),所以肯定要先打素数表,然后再在while(!=EOF)里操作寻找质因子。
但是这里const int maxn又不能等于109(编译器不会让你通过的),因为算法是质因子全部小于等于sqrt(n),或者只有一个大于 n \sqrt{n} n ,而其他全小于等于 n \sqrt{n} n ,于是maxn的值只要比 1 0 9 \sqrt{10^9} 109 大一点即可,我这里直接跟书上一样写了100010。
代码

#include
#include
#include
#include
#include
#include
using namespace std;const int maxn = 100010;struct factor{ int number; int cnt;}fac[10];bool p[maxn] = { 0};int prime[maxn], pNum = 0;int main(){ for(int i=2;i

问题 D: 约数的个数

题目描述

输入n个整数,依次输出每个数的约数的个数。
输入
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
输出
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
样例输入

61 4 6 8 10 120

样例输出

134446

思路

思路很简单,把输入的数存在一个数组里,然后遍历这个数组,对于每个数ni再从1到ni寻找它的约数个数。
但是要注意的一点是,这一题要进行算法上的优化,不然时间肯定是会超时的(两重for循环的时间复杂度是O(N2),最大有1018),于是我的优化方法是参考了书上的想法,所有数的因子肯定是按照 n \sqrt{n} n 对称分布的,于是在寻找因子的时候,只要遍历到 n \sqrt{n} n 即可。但是这里要判断一下,如果这个因子和它的对称因子正好相等,那因子数量只加1(如4/2=2,2和2相等,只计1次),如果不相等,因子数量就加2(如6/2=3,说明2和3都是它的因子)。
代码

#include
#include
#include
#include
#include
#include
using namespace std;int tmp1[1001]={ 0};//存放输入的数 int tmp2[1001]={ 0};//存放每个数对应的因子数 int main(){ int N; while(scanf("%d", &N) != EOF){ if(N==0) break; for(int i=1;i<=N;i++) scanf("%d", &tmp1[i]); for(int i=1;i<=N;i++){ int cnt = 0; int sqr = (int)sqrt(1.0*tmp1[i]); for(int j=1;j<=sqr;j++){ if(tmp1[i]%j==0){ if(j!=tmp1[i]/j) cnt+=2;//找到一个因子对,数量加2 else cnt++;//如果两者相等,说明是同一个因子,数量加1 } } tmp2[i] = cnt; } for(int i=1;i<=N;i++) printf("%d\n", tmp2[i]); memset(tmp1, 0, sizeof(tmp1)); memset(tmp2, 0, sizeof(tmp2)); } return 0;}

问题 E: 完数与盈数

题目描述

一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1,则称其为“完数”;
若因子之和大于该数,则称其为“盈数”。求出2 到60 之间所有“完数”和“盈数”,并以如
下形式输出: E: e1 e2 e3 …(ei 为完数) G: g1 g2 g3 …(gi 为盈数)
输入
输出
按描述要求输出(注意EG后面的冒号之后有一个空格)。
思路
这题也很简单,和问题B差不多,不过这里要注意“盈数”的概念和格式输出。“盈数”指的是因子之和大于该数,也就是说还存在因子之和小于该数的数(比如4,它的因子1+2<4),而不是简单的不是“完数”则是“盈数”。另外,EG后面的冒号有一个空格之外,E组的最后一个数和字母G之间也有一个空格。
代码

#include
#include
#include
#include
#include
#include
using namespace std;int E[61], G[61], ENum = 0, GNum = 0;int main(){ for(int i=2;i<=60;i++){ //2~60的数 int temp = i; for(int j=1;j

小结

这一类找约数的问题想法和思路还是很简单的,但是要注意的是,如果给的数范围过大,就很容易发生超时(比如109),这个时候就要用算法来优化了,最好的办法是对于素数,用筛法打表预处理,对于普通的数,把1~N的因子搜索范围缩小到1~ N \sqrt{N} N

转载地址:http://vxtp.baihongyu.com/

你可能感兴趣的文章
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB可视化客户端管理工具之NoSQLbooster4mongo
查看>>
Mongodb学习总结(1)——常用NoSql数据库比较
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
mongodb定时备份数据库
查看>>
mppt算法详解-ChatGPT4o作答
查看>>
mpvue的使用(一)必要的开发环境
查看>>
MQ 重复消费如何解决?
查看>>
mqtt broker服务端
查看>>
MQTT 保留消息
查看>>
MQTT 持久会话与 Clean Session 详解
查看>>
MQTT介绍及与其他协议的比较
查看>>
MQTT工作笔记0007---剩余长度
查看>>
MQTT工作笔记0008---服务质量
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
Mqtt搭建代理服务器进行通信-浅析
查看>>
MS COCO数据集介绍
查看>>
MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
查看>>
ms sql server 2008 sp2更新异常
查看>>