查找t个测试用例的数字除数

时间:2014-10-05 08:12:46

标签: java dynamic-programming

测试用例数为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;
    }
}

1 个答案:

答案 0 :(得分:1)

Fundamental theorem of arithmetic说,每个大于1的整数都是素数或素数的乘积。这意味着要找到一个数的所有除数,你至少需要找到它的素数因子分解。一旦你进行了素数分解,你可以通过乘以一些素数来得到所有其他除数。另一种方法是通过所有合理的*整数并计算除数。

这两种方法都很耗时,因为在第一种方法中,你需要

  1. 找到素数 - 不容易,但你不必一个一个地去测试。可以找到素数因子分解,例如通过递归。
  2. 查找组合低于sqrt(n)的这些素数的所有组合。
  3. 在第二种情况下,你只需逐一进行测试,这显然是耗时的。


    *合理的整数是那些低于n的平方根的整数,因为它是划分n的最高可能数,因此尝试更高的整数是没用的。

    编辑:计算到sqrt(n)不会给你所有的除数,只有一半的除数:当你将n除以q1 <= sqrt(n)时,你得到另一个q2 >= sqrt(n)。通过仅计算最多sqrt(n),您只得到q1 s,因此您必须将最终数字加倍,然后如果n是平方数,则减去1(因为您将计算{{ 1}}两次)。