试题链接:因子个数__牛客网
先贴代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
//输入n:
int n = scanner.nextInt();
int count = 0; //count记录因子的个数
for (int i = 2; i < Math.sqrt(n); i++) {
if (n % i == 0){ //如果n mod i == 0 那么i为n的因子
//如果n还能继续被 i 整除,那么继续除以 i 直到 i 不是 n 的因子为止
while (n % i == 0){
n /= i;
}
count++; //记录下n的因子i
}
}
if (n != 1){
count++;
}
System.out.println(count);
}
}
}
解体思路:
要求输出一个数n的所有因子,首先因子肯定是不能为1和它本身的。并且重复的因子只算一个。那么我们从最小因子2开始到最大因子n的平方根结束,依次遍历这个区间的每个数:
当我们遍历到i,并且i可以被n整除时,那么i就是n的因子,此时进入if语句,把count+1。但是题目中又提到,相同的因子只能计数一次,因此我们需要继续循环除以这个因子i,直到不能整除i为止,表示此时i已经不是n的因子了:
到这一步为止就可以继续遍历因子集合了,找到下一个n的因子,再重复上述操作,直到n已经不能被任何数整除时,for循环结束。
当循环结束后,还需要判断一下n现在的值,当n现在不为1时,此时的n也是一个因子,也需要将count+1;因为在开头我们就说过计算因子的时候是不计数1和它本身的: