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

题目:因子个数     因子个数

        一个正整数可以分解成一个或多个数组的积。例如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} ] 中。

《因子个数》:输出每个正整数的因子个数_第1张图片

我们以 26 为例:   《因子个数》:输出每个正整数的因子个数_第2张图片

代码:

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);
        }
    }
}

 

你可能感兴趣的:(题目练习,数据结构)