判断N个数是否是完全数

简介: 判断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≤10^8^

解析

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

  • 1不是完全数
  • 假设数为x,a为其约数,则x/a也为其约数, 因为 a * (x/a) = x
    假设约数中较小的那方为a,则a最大为x^1/2^
  • 所以我们只需从2开始遍历其前x^1/2^(含x^1/2^)的数即可,记得先将sum+1,因为1也算入约数

因为x最大为10^8^,开根号后为10^4^,100个数需10^6^<10^8^,所以不会超时。

另一思路: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;
}
目录
相关文章
|
6月前
|
存储 算法 JavaScript
判断奇偶数
判断奇偶数
|
27天前
判断一个数是否为回文数
【10月更文挑战第23天】判断一个数是否为回文数。
35 4
|
5月前
数组\判断是否能被已知且小于x的素数整除
数组\判断是否能被已知且小于x的素数整除
26 0
|
6月前
|
算法 测试技术 C#
【最大公约数 调和级数】2183.统计可以被 K 整除的下标对数目
【最大公约数 调和级数】2183.统计可以被 K 整除的下标对数目
|
Go
怎样判断一个数是否为偶数
怎样判断一个数是否为偶数
99 0
|
6月前
回文数的个数
回文数的个数
|
程序员
【牛客网】HJ99 自守数、OR86 返回小于 N 的质数个数
目录 HJ99 自守数 OR86 返回小于 N 的质数个数
83 0
判断数的奇偶性
判断数的奇偶性
96 0
|
Python
判断一个数能否同时被4和5整除
判断一个数能否同时被4和5整除
83 0
|
算法
判断一个数是否能被3或5整除
判断一个数是否能被3或5整除
162 0