题目:链接:https://ac.nowcoder.com/acm/contest/8997/A
来源:牛客网
若一个数除了自己本身以外,所有因子之和等于它自己,那么称这个数为“完全数”。
例如,6的因子有1,2,3,6,1+2+3=6,所以6是完全数。
而8的因子有1,2,4,8,1+2+4=7,所以8不是完全数。
同样的,我们定义:若一个数除了自己本身以外,所有因子之和大于它自己,那么称这个数为“过剩数”,例如12。
若一个数除了自己本身以外,所有因子之和小于它自己,那么称这个数为“不足数”,例如8。
输入一个数,判断它是完全数、过剩数还是不足数。
``
public static void main(String[] args) {
int sum = 1;
Scanner sc = new Scanner(System.in);
long x = sc.nextLong();
for (int i = 2; i< Math.sqrt(x); i++) {
if (x % i == 0) {
sum+=i;
sum+=x/i;
}
}
if(Math.sqrt(x)-(int)Math.sqrt(x) < 10e-6) {
sum+=(int)Math.sqrt(x);
}
if (sum == x) {
System.out.println("Pure");
} else if (sum < x) {
System.out.println("Early");
} else {
System.out.println("Late");
}
}
出错点:
1、sum 的类型定义,数据规模达到了10e14,所以要使用long类型
2、i < Math.sqrt(x)的判断上,一开始使用i * i < x 的方式处理,但是忽略了i的类型,i * i的结果越界,出现了超时错误。
注意点:
1、如果输入的数据是一个完全平方数,那么,使用i < Math.sqrt(x)就少加一个Math.sqrt(x),
使用i <= Math.sqrt(x)就多加一个Math.sqrt(x),所以需要额外的进行一个判断处理。
2、 Math.sqrt(x)的返回结果是一个double型的数据,不可以直接用 == 运算符比较。