《因子个数》:输出每个正整数的因子个数

文章描述了一个编程问题,要求编写Java程序来计算给定正整数的因子个数。通过循环从2到平方根(n)找出因子,优化了搜索范围以提高效率。对于每个找到的因子i,会不断除以n直到无法整除,统计因子个数并输出结果。
摘要由CSDN通过智能技术生成

题目:因子个数     因子个数

        一个正整数可以分解成一个或多个数组的积。例如36=2*2*3*3,即包含2和3两个因子。NowCoder最近在研究因子个数的分布规律,现在给出一系列正整数,他希望你开发一个程序输出每个正整数的因子个数。

输入描述:
        输入包括多组数据。
        每组数据仅有一个整数n (2≤n≤100000)。

输出描述:
        对应每个整数,输出其因子个数,每个结果占一行。示例1
输入:
30

26

20
输出:
3

2

2

思路:

        大致思路是一直循环找因子,由题目可以知道,因子要从 2 开始判断。先判断 i 是否能被 n 整除,如果能的话,就一直除,并且更新 n 的值,因为还要判断除了当前的 i 还有哪些因子可以和 该i 相乘得到 n。而一个因子可以乘多次,但是数量只加 1 。

但是还有很多细节要注意:

        如果直接找因子的循环从 2 ~ n 的话,会不通过,显示超时。因此我们要对循环条件进行优化。 

        如果 n = x * y,那么如果 x <= y ,那么 x 一定在 [ 2 , \sqrt{n} ] 中。

我们以 26 为例:   

代码:

import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * Description:输出每个正整数的因子个数
 * User: WangWZ
 * Date: 2023-04-10
 * Time: 16:26
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()) {
            int n = scanner.nextInt();
            int count = 0;
            for(int i = 2;i < Math.sqrt(n); i++) {
                if(n % i == 0) {
                    //n%i == 0,说明 i 可以通过乘积的形式组成 n
                    while(n%i == 0) {
                        //循环除,因为题目上说明了,一个因子可以乘积多次
                        //当乘到 乘完后的n 不能再被 i 整除了,再判断下一个i
                        n = n / i;
                    }
                    count++;
                }
            }
            //循环判断结束
            // n == 1 , 说明乘完了,积就是 输入的n
            // n != 1 , 说明还没乘完,循环结束的 n 是一个素数,所以其也是一个因子
            if(n != 1) {
                count++;
            }
            System.out.println(count);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值