【算法】求因数的算法优化

⭐️求因数的算法优化

提起因数,小学就已经接触过了,就是能被整除的数,比如2能被8整除,那么2就是8的因数(怎么感觉在讲小学题呢🐾)

给出一个求因数的案例:

input:给定一个数,要求输出这个数的因数个数

output:因数个数

那么将求因数的过程转换成代码就像下面这样,这是最基础的求因数的方法,用一层for循环就可以实现,现在重点要说的是优化代码

🚀优化代码

思路

比如求n的因数个数,首先对n开平方(这样就把问题的规模缩小了非常多,相当于把O(n)的降到了O(√n)),然后遍历从1到n开根号,对满足n%i==0条件的进行计数,然而如果只满足这个条件的计数那就错了,还需要在该条件内加一个判断其对立数条件(至于为什么这样做,可以理解成i的对立数,n%i==0说明了i是n的因数,那么n/i也应该是n的因数,n/i是i的对立数),这样就通过一次循环直接找到了两个因数,这也是为什么优化后执行速度快了许多。

举例说明

可能看完上面的描述还不是特别清楚,那么就把上面的内容带入到实际中,再来看一看。

求16的因数个数,首先对16开根号为4,然后遍历1到4,

第一轮循环:1符合,那么对立16也符合

第二轮循环:2符合,对立8也符合

第三次循环:3不符合,对立也不符合

第四次循环:4符合,对立4也符合(注意同一个数只能被计算一次)

这样就好理解多了

注意

不知道大家发现问题没有,对于上面例子中的第四次循环,4符合,那么4的对立也是4,按照上面的思路,第四次循环应该发现了两个因数,但事实是只有一个4,也就是重复了,那么在判断其对立数的时候,加上一个if语句判断是否相等就可以解决了。

测试用例

input:16

output:6

input:2021041820210418

output:128

当然第二个测试用基础代码是很难跑出来的

💻代码

package com.第十二届;

import java.util.Scanner;

/**
 * @Author Lunau
 * @Create 2022-03-16 17:17
 * @Description 关于因数
 * @Result
 */
public class GetFactor {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long num = sc.nextLong();
        System.out.println("优化代码:"+factor2(num));
        System.out.println("基础代码:"+factor1(num));

    }
    //求因数个数基础代码
    public static int factor1(long num) {
        int count=0;
        for(int i=1;i<=num;i++) {
            if(num%i==0)
                count++;
        }
        return count;
    }
    //求因数优化代码
    public static int factor2(long num) {
        int count = 0;
        for(int i=1;i<=Math.sqrt(num);i++) {
            if(num%i==0) {
                count++;
                //num%i==0,那么num/i也应该是num的因数,例如8和2 2是因数,4也是的
                if(i!=num/i) {	//避免重复计数
                    count++;
                }
            }
        }
        return count;
    }
}
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值