题目 1017: [编程入门]完数的判断(C++超详细注释讲解)

56 篇文章 0 订阅

题目描述

一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,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++入门习题内容!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值