题目描述:
一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<iostream> int main() { int i,j,sum=0,k,m,n,a[100]; std::cin>>n; for(i=1;i<=n;i++) { k=0;sum=0; for(j=1;j<=i/2;j++) if(i%j==0) a[k++]=j; for(m=0;m<k;m++) sum+=a[m]; if(sum==i) { std::cout<<i<<" "<<"its factors are "; for(m=0;m<k;m++) std::cout<<a[m]<<" "; std::cout<<std::endl; } } return 0; }@神鬼一刀流 #include <stdio.h> int main() { long double N, sum = 0; int factor[100], x = 0; scanf( "%Lf", &N ); for ( int i = 6; i <= N; i++ ) { if ( i % 10 == 6 || i % 10 == 8 ) { for ( int j = 1; j <= i / 2; j++ ) { if ( i % j == 0 ) { factor[x] = j; x++; sum = sum + j; } } if ( sum == i ) { printf( "%d its factors are ", i ); for ( int k = 0; k < x; k++ ) { printf( "%d ", factor[k] ); } printf( "\n" ); } sum = 0; x = 0; } } return(0); }