实验五 循环结构

题目需求:

完全数,又称为完美数或完备数,是一些特殊的自然数,它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。例如,第一个完全数是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当输入的数很大始,执行速度对比解法一慢许多,推荐解法一

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值