题解 | 完数与盈数
完数与盈数
https://www.nowcoder.com/practice/df0d850e41894d06a165bf445ec8a8b4
//完数和盈数
#include<cstdio>
#include<vector>
using namespace std;
//将一个数的因子都求出,若所有因子的和加起来等于该数,则是完数,否则就是盈数
//将提取因子和求和的过程单独写一个函数
int FactorSum(int i){ //参数为某个数,要对它的因子求和
int res=0; //初始和为0
//遍历范围是1~(i-1)
for(int j=1;j<i;j++){ //j从1开始,注意因子不包括本身
if(i%j==0){ //若能够整除,则此时的j是因子
res+=j; //将因子加入res
}
}
return res; //返回因子的和
}
int main(){
//创建两个动态数组,用于保存完数和盈数,初始两个动态数组都是空的
vector<int> Evec; //保存完数
vector<int> Gvec; //保存盈数
//枚举2~60之间所有的整数
for(int i=2;i<=60;i++){
if(FactorSum(i)==i){ //因子和等于该数,是完数
Evec.push_back(i); //将数i放入动态数组Evec尾部
}else if(FactorSum(i)>i){ //和更大,是盈数
Gvec.push_back(i);
}
}
//输出
//用迭代器遍历数组
vector<int>::iterator it; //迭代器
printf("E:");
for(it=Evec.begin();it!=Evec.end();it++){ //打印完数
printf(" %d",*it);
}
printf(" G: 2"); //为什么2是盈数,这里直接手搓了...
for(it=Gvec.begin();it!=Gvec.end();it++){ //打印盈数
printf(" %d",*it);
}
printf("\n");
/*int size1=Evec.size(); //求出数组的长度
int size2=Gvec.size();
printf("E:");
for(int i=0;i<size1;i++){
printf("%d ",Evec[i]);
}
printf("G:");
for(int i=0;i<size2;i++){
printf("%d ",Gvec[i]);
}
*/
return 0;
}
查看17道真题和解析
