2012年7月4日水曜日

AOJ Volume21 2101: Perfect Number

以前の約数を求める考え方では時間が足りない。
よって、半分で済むように i*i=nまでfor文をまわす。

この時、    i*i=nの時は sum+=i
そうでなければ  sum+= i + (n/i)として改善した。


問題文に「その数自身を除く約数の和を S とする.」とあることを忘れずに。


 /********************************
*  2012/07/04                           *
*  AOJ Volume21 2101             *
*  Perfect Number                   *
*  crane                                    *
*********************************/


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


int main(){
    int n;
    while(cin >> n,n){
        int sum=0;
        for(int i=1; i*i<=n; i++)
            if(n % i == 0){
                if(i*i == n) sum+=i;
                else         sum += i+(n/i);
            }
        sum -= n;
        if(sum==n)      cout << "perfect number" << endl;
        else if(sum<n) cout << "deficient number" << endl;
        else                  cout << "abundant number" << endl;
    }
    return 0;
}

0 件のコメント:

コメントを投稿