1. 程式人生 > >AT934 【完全數】【題解】

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;
}