测试用例数为t,其中1<=t<=1000
数字为n,1<=n<=1000000000
。这是我试过的代码,但是有时间可以有更好的方法,比如动态编程..如果有的话请建议我代码
public class Main{
public static void main(String args[])throws java.lang.Throwable{
Scanner in=new Scanner(System.in);
int t=Integer.parseInt(in.nextLine());
for(int i=0;i<t;i++){
System.out.println(factors(Integer.parseInt(in.nextLine())));
}
}
public static int factors(int number){
int count;
int result=1;
for (int i = 2; i<=(number); i++){
count=0;
while (number % i == 0) {
number /= i;
count++;
}
if(count == 0)
continue;
result*=(count+1);
}
return result;
}
}
答案 0 :(得分:1)
Fundamental theorem of arithmetic说,每个大于1的整数都是素数或素数的乘积。这意味着要找到一个数的所有除数,你至少需要找到它的素数因子分解。一旦你进行了素数分解,你可以通过乘以一些素数来得到所有其他除数。另一种方法是通过所有合理的*整数并计算除数。
这两种方法都很耗时,因为在第一种方法中,你需要
在第二种情况下,你只需逐一进行测试,这显然是耗时的。
*合理的整数是那些低于n
的平方根的整数,因为它是划分n
的最高可能数,因此尝试更高的整数是没用的。
编辑:计算到sqrt(n)
不会给你所有的除数,只有一半的除数:当你将n
除以q1
<= sqrt(n)
时,你得到另一个q2
>= sqrt(n)
。通过仅计算最多sqrt(n)
,您只得到q1
s,因此您必须将最终数字加倍,然后如果n
是平方数,则减去1(因为您将计算{{ 1}}两次)。