判断N个数是否是完全数

🌵🌵🌵前言

✨你好啊,我是“ 怪& ”,是一名在校大学生哦。
🌍主页链接:怪&的个人博客主页
☀️博文主更方向为:课程学习知识、作业题解、期末备考。随着专业的深入会越来越广哦…一起期待。
❤️一个“不想让我曾没有做好的也成为你的遗憾”的博主。
💪很高兴与你相遇,一起加油!

题目

一个整数,除了本身以外的其他所有约数的和如果等于该数,那么我们就称这个整数为完全数。

例如,6 就是一个完全数,因为它的除了本身以外的其他约数的和为 1+2+3=6。

现在,给定你 N 个整数,请你依次判断这些数是否是完全数。

  • 输入格式
    第一行包含整数 N,表示共有 N 个测试用例。

    接下来 N 行,每行包含一个需要你进行判断的整数 X。

  • 输出格式
    每个测试用例输出一个结果,每个结果占一行。

    如果测试数据是完全数,则输出 X is perfect,其中 X 是测试数据。

    如果测试数据不是完全数,则输出 X is not perfect,其中 X 是测试数据。

  • 数据范围
    1≤N≤100,
    1≤X≤108

解析

c++1s中内,大概可以计算<1亿次,
若每次皆为1亿,计算100次,则循环100亿次,>1亿次,已超时,所以需要优化。

  • 1不是完全数
  • 假设数为x,a为其约数,则x/a也为其约数, 因为 a * (x/a) = x
    假设约数中较小的那方为a,则a最大为x1/2
  • 所以我们只需从2开始遍历其前x1/2(含x1/2)的数即可,记得先将sum+1,因为1也算入约数
    因为x最大为108,开根号后为104,100个数需106<108,所以不会超时。

另一思路:100000000 内的完全数有且仅

  • 6
  • 28
  • 496
  • 8128
  • 335503366
    直接比较即可

代码

#include <iostream>
#include <cmath>
using namespace std;

int main(){
    int n;cin>>n;
    for(int i=0;i<n;i++){
        int x;cin>>x;
        int sum=0;
        
        if(x==1) sum=0;
        else{
            sum+=1; //加上1
            for(int j=2;j*j<=x;j++){
                if(x%j==0) {
                    if(j!=x/j)  sum=sum+j+x/j;
                    else sum+=j;
                }
            }    
        }
        if(sum==x) cout<<x<<" is perfect"<<endl;
        else cout<<x<<" is not perfect"<<endl;
    }
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪&

感谢您的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值