AT934 【完全数】【题解】

题目背景

给定一个数,将其约数(不含自己)相加,如果等于本身,输出“ P e r f e c t Perfect ”,小于本身,输出“ D e f i c i e n t Deficient ”,大于本身,输出“ A b u n d a n t Abundant ”。

题目描述

高橋君は完全なものが大好きです。

自然数には、完全数というものがあります。 完全数というのは、自分以外の約数の総和が自分と等しくなる自然数のことです。 例えば 6 6 の場合 1\ +\ 2\ +\ 3\ =\ 6 1 + 2 + 3 = 6 となるので完全数です。 それに対して、自分以外の約数の総和が自分より小さくなる場合は不足数と言い、大きくなる場合は過剰数と言います。

高橋君には今気になっている自然数があります。高橋君のために、それが完全数なのか不足数なのか過剰数なのか判定してください。

You are given a word s s . Can you predict what will it become after correction?

In this problem letters a, e, i, o, u and y are considered to be vowels.

输入输出格式

输入格式:

入力は以下の形式で標準入力から与えられる。

N

  • 1 行目に高橋君が気になっている自然数 N   ( 1     N     1 0 10 ) N\ (1\ ≦\ N\ ≦\ 10^{10}) が与えられる。
输出格式:

N N が完全数ならばPerfect、 不足数ならばDeficient、 過剰数ならばAbundant、を 1 1 行で出力せよ。

输入输出样例
输入样例#1:

6

输出样例#1:

Perfect

输入样例#2:

24

输出样例#2:

Abundant

输入样例#3:

27

输出样例#3:

Deficient

输入样例#4:

945

输出样例#4:

Abundant

思路很简单,大致就是循环枚举因数然后加起来
只要能整除就是因数,因此一次循环可以加上两个因数,所以只要循环 n \sqrt n 次(否则会 T L E TLE

注意:一定要换行!

代码:

#include<iostream>//不解释
#include<cmath>
using namespace std;
long long n,ans;
int main(){
    cin>>n;//输入
    for(int i=1;i<=sqrt(n);i++)//循环找其因数,到sprt(n)是减少循环次数,优化
        if(n%i==0)
        {
            ans=ans+i;//累加因数
            ans=ans+n/i;//累加相对的因数
        }
    if(sqrt(double(n))==sqrt(n))//判断是否为完全平方数
            ans-=sqrt(n);//如果是,就减去
    //因为1也是完全平方数,不用另行判断
    if(ans-n==n)  cout<<"Perfect"<<endl;
    else if(ans-n<n) cout<<"Deficient"<<endl;
    else cout<<"Abundant"<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44023181/article/details/84949355