A 完全数
题目描述
若一个数除了自己本身以外,所有因子之和等于它自己,那么称这个数为“完全数”。
例如,6的因子有1,2,3,6,1+2+3=6,所以6是完全数。
而8的因子有1,2,4,8,1+2+4=7,所以8不是完全数。
同样的,我们定义:若一个数除了自己本身以外,所有因子之和大于它自己,那么称这个数为“过剩数”,例如12。
若一个数除了自己本身以外,所有因子之和小于它自己,那么称这个数为“不足数”,例如8。
输入一个数,判断它是完全数、过剩数还是不足数。
输入描述
一个正整数
输出描述
如果是完全数,则输出“Pure”。
如果是过剩数,则输出“Late”。
如果是不足数,则输出“Early”。
示例1
输入
28
输出
Pure
说明
1+2+4+7+14=28
示例2
输入
15
输出
Early
说明
1+3+5=9<15
示例3
输入
72
输出
Late
说明
1+2+3+4+6+8+9+12+18+24+36>72
备注
对于20%的数据, 。
对于50%的数据, 。
对于100%的数据, 。
解法
思考
数据范围1e14,如果要一个数一个数的试是否能够被n整除肯定要超时。
由于一个数n的因数a如果大于根号n,那么必定存在因数b<n使得ab=n。(否则如果a、b都大于根号n,则ab大于n)。
因此数据范围缩小到1~√n。1e7不至于超时。
i从2到根号n循环,如果n能整除i,因数和就加上i和n/i;当i正好等于根号n时需要特判。
AC代码
#include<bits/stdc++.h> using namespace std; int main() { long long n; scanf("%lld",&n); long long sum=1; long long k=sqrt(n); for(long long i=2;i<k;i++) { if(n%i==0)//n能够整除i { sum+=i+n/i; } } if(n%k==0) { sum+=k; if(n/k!=k)sum+=n/k; } if(sum>n)puts("Late"); else if(sum<n)puts("Early"); else puts("Pure"); return 0; }