题目描述
一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子
题目链接
https://www.dotcpp.com/oj/problem1017.html
分析
本题考察函数式编程,我们可以编写两个函数来帮助解题,一个是vector<int> getFactors(int n)
用于计算n
的所有因子(注意不包含n
自身),再用一个函数void f(int n)
来作为一个子问题判断n是否是完数,main函数用一个循环即可实现1 ~ n
的完数判断。
🎈 作者:Eriktse
🎈 简介:19岁,211计算机在读,现役ACM银牌选手🏆力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)🚀
代码(超详细注释)
#include <iostream>
#include <vector>
#include <algorithm>//用于调用sort函数
using namespace std;
using ll = long long;//用long long防止数据溢出,爆int
vector<int> getFactors(int n)
{
//计算n的所有因子,并保存在vector中返回
vector<int> res;//res表示结果, res 意思是 result
for(int i = 1;i <= n / i; ++ i)//注意这里i的范围是从2到根号n
{
//如果 i 不是 n 的因子就直接跳过
if(n % i)continue;
if(i != n)res.push_back(i);//将i作为一个因子加入到res中
//这一步判断非常重要,避免重复加入res数组,也避免将n加入到res
if(i != n / i && n / i != n)
{
res.push_back(n / i);
}
}
//给数组排序,两个参数分别为vector的迭代器起始和结束位置,左闭右开
sort(res.begin(), res.end());
return res;
}
void f(int n)
{
//判断n是否是完数,如果是,就输出所有因子,否则直接返回
vector<int> fts = getFactors(n);
ll sum = 0;//sum表示n的所有因子之和
for(int i = 0;i < fts.size(); ++ i)sum += fts[i];
if(sum != n)return;//如果n不是完数就直接返回
cout << n << " its factors are ";
for(int i = 0;i < fts.size(); ++ i)cout << fts[i] << ' ';
cout << '\n';
}
int main()
{
int n;cin >> n;
for(int i = 1;i <= n; ++ i)f(i);
return 0;
}
🎈创作不易,欢迎关注我的CSDN账号!持续更新优质C++入门习题内容!
🎈创作不易,欢迎关注我的CSDN账号!持续更新优质C++入门习题内容!