题目:因子个数 因子个数
一个正整数可以分解成一个或多个数组的积。例如36=2*2*3*3,即包含2和3两个因子。NowCoder最近在研究因子个数的分布规律,现在给出一系列正整数,他希望你开发一个程序输出每个正整数的因子个数。
输入描述:
输入包括多组数据。
每组数据仅有一个整数n (2≤n≤100000)。输出描述:
对应每个整数,输出其因子个数,每个结果占一行。示例1
输入:
3026
20
输出:
32
2
思路:
大致思路是一直循环找因子,由题目可以知道,因子要从 2 开始判断。先判断 i 是否能被 n 整除,如果能的话,就一直除,并且更新 n 的值,因为还要判断除了当前的 i 还有哪些因子可以和 该i 相乘得到 n。而一个因子可以乘多次,但是数量只加 1 。
但是还有很多细节要注意:
如果直接找因子的循环从 2 ~ n 的话,会不通过,显示超时。因此我们要对循环条件进行优化。
如果 n = x * y,那么如果 x <= y ,那么 x 一定在 [ 2 , ] 中。
;
我们以 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);
}
}
}