题目需求:
完全数,又称为完美数或完备数,是一些特殊的自然数,它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。例如,第一个完全数是6,它的约数1、2、3、6,去除它本身6外,其余3个数相加,1+2+3=6.第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。编程用户输入一个整数,输出该数是否为完全数。
样例输入
6
样例输出
6 is perfect number
思路分析:
1.创建Scanner实例化对象用来接受用户数据
2.寻找用户输入的数据n的除1和n的真因子
3.将寻找到的真因子求和
4.将所有质因子和加1然后与n进行比较
5.输出结果
解法一:取余,看余数是否为0
public static void main(String[] args) {
//1.实例化Scanner对象,用来接收用户数据
Scanner nc=new Scanner(System.in);
//2.将用户输入数据赋值给变量n
int n= nc.nextInt();
int count=0;
//因为所有的数的都存在一个因子1,所以我们从2开始遍历,寻找n的因子
for (int i=2;i<n;i++){
if(n%i==0){//如果n%i==0,证明i是n的一个因子,则另一个因子j==n/i
int j=n/i;
//将此时的两个因子相加起来,存储到count中,并开始寻找下一对因子
count+=i+j;
}
}
//由于i,j都是自然数且是n的因子,所以必定i,j<n
//则在循环时count会将同一对因子加两次
//例如n=6,则当i=2时,j=3此时count加了一次i和j
//当i=3时,j=2,count又会加一次同一对因子,所以需要对最后的count除以二。
//由于n必有一个因子为1,所以对count以下处理
count=count/2+1;
//将所有除了其本身外的所有因子和与n进行判断是否相等
if(count==n){
System.out.println(n+" is perfect number");
}else {
System.out.println(n+" is not perfect number");
}
}
解法2:暴力匹配
public static void main(String[] args) {
//接受用户数据
Scanner nc=new Scanner(System.in);
int x= nc.nextInt();
int count=0;
//嵌套循环 如果i*j==x,则i和j为x的真因子,此时记录到count中
for(int i=2;i<x;i++){
for (int j=2;j<x;j++){
if(i*j==x){
count+=j+i;
}
}
}
//此种方法依然会出现解法一的问题
//对count进行相同处理
count=count/2+1;
if(count==x){
System.out.println(x+" is perfect number");
}else {
System.out.println(x+" is not perfect number");
}
}
解法2当输入的数很大始,执行速度对比解法一慢许多,推荐解法一