题目描述:
一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子
输入
N
输出
? its factors are ? ? ?
样例输入
1000
样例输出
6 its factors are 1 2 3
28 its factors are 1 2 4 7 14
496 its factors are 1 2 4 8 16 31 62 124 248
编译环境:
Ubtun Debain Linux g++
Windows
数据测试:
本人进行了三组测试:
解题思路:
何为因子?最通俗说,如果说j是i的因子,那么i%j==0(整除) 又因为题目中完数的定义:
一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。
那么 j的范围就是1~i-1 .
对于本题,我定义了一个Vector容器来存储所有的因子(注意Vector类似于C/C++中的动态数组)
求1-N之间所有的完数。
我使用了双层循环,第一层循环i 取 [1~N] 遍历1到N之间所有的数。
第二层循环j表示的是因子。由于因子不能取到本身i,j 应该取1到i-1之间,即j取[1,i)
如果是因子,那么就把因子放入容器中(可以理解为存入数组)
并把所以因子累乘,如果累乘的结果sum和数本身i相等,那么就是完数!
注意事项:
注意数据输出格式!!!
如果有C语言同学看不懂,可以在下方评论,我可以将下列代码转换成C语言形式!!!
定义迭代器:
vector<变量类型>::iterator 变量名
例如:
vector<int>::iterator iter;
注意每个数判断完之后,一定要清空容器vec.clear()。
比如说6这个数。不含本身的因子有1 2 3,全部存入vec。
那么vec[0]=1 vec[1]=2 vec[3]=3
如果不清空vec这个容器,再次循环时,i 取到7。7有因子1,那么 1将继续存入上次的vec容器中,
vec[4]=1。
导致原本7的所有因子之和为1 变成了1+2+3+1。
所以一定要清空容器。
参考代码:
#include <iostream> #include <vector> using namespace std; int main() { int N,sum; vector<int> vec; cin>>N; for(int i=1; i<=N; i++) //遍历1~N之间所有数 { sum=0; for(int j=1; j<i; j++) //j是因子 范围取1~i-1 { if(i%j==0) //如果j是因子 { vec.push_back(j); //存入容器 sum+=j; //是因子就把因子累加 } } if(sum==i) //所有因子之和sum和数本身i相等,则是完数! { cout<<i<<" its factors are "; for(vector<int>::iterator iter=vec.begin(); iter!=vec.end(); iter++) { cout<<*iter<<" "; } cout<<endl; } vec.clear(); //一定要清空容器 } }
0.0分
9 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复