Java 对于t测试用例,查找数字的除数

Java 对于t测试用例,查找数字的除数,java,dynamic-programming,Java,Dynamic Programming,测试用例的数量是t,其中1表示,每个大于1的整数要么是素数,要么是素数的乘积。这意味着要找到一个数的所有因子,你至少需要找到它的素因子分解。一旦你有了素数分解,你可以通过乘以一些素数得到所有其他的因子。另一种方法是遍历所有合理的*整数并计算除数 这两种方法都很耗时,因为在第一种方法中,您需要 找到素数-不容易,但你不必一个接一个地去测试。素因子分解可以通过递归等方法找到 找出这些素数的所有组合,其组合低于sqrt(n) 在第二种情况下,您只需逐个进行测试,这显然很耗时 *合理整数是那些小于n平

测试用例的数量是t,其中
1表示,每个大于1的整数要么是素数,要么是素数的乘积。这意味着要找到一个数的所有因子,你至少需要找到它的素因子分解。一旦你有了素数分解,你可以通过乘以一些素数得到所有其他的因子。另一种方法是遍历所有合理的*整数并计算除数

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

  • 找到素数-不容易,但你不必一个接一个地去测试。素因子分解可以通过递归等方法找到
  • 找出这些素数的所有组合,其组合低于sqrt(n)
  • 在第二种情况下,您只需逐个进行测试,这显然很耗时


    *合理整数是那些小于
    n
    平方根的整数,因为它是除
    n
    的最大可能数,所以尝试更高的整数是无用的

    编辑:计数到
    sqrt(n)
    并不能得到所有的除数,但只能得到其中的一半:当您将
    n
    除以
    q1
    时,即
    =sqrt(n)
    。通过最多只计算
    sqrt(n)
    您只得到
    q1
    s,因此您必须将最终数字加倍,然后如果
    n
    是一个平方数,则减去1(因为您将计算
    sqrt(n)
    两次)

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