Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:高效地查找一个非常大的数的除数总数_Java - Fatal编程技术网

Java:高效地查找一个非常大的数的除数总数

Java:高效地查找一个非常大的数的除数总数,java,Java,号码是 n=2747502308387844992 计数=0 像使用for循环这样的常规方法不起作用 for(i=1;i<n;i++) { if(n%i == 0 ){count++;} } System.out.println(count%(Math.pow(10,9)+7)); for(i=1;iintend=(int)Math.sqrt(x); 对于(i=1;i您可以将数字划分为特定范围的分区,然后使用线程查找这些间隔的除数并将它们添加到ArrayList中 假设您想找到1

号码是 n=2747502308387844992 计数=0 像使用for循环这样的常规方法不起作用

for(i=1;i<n;i++)
{
    if(n%i == 0 ){count++;}
}
System.out.println(count%(Math.pow(10,9)+7));
for(i=1;i
intend=(int)Math.sqrt(x);

对于(i=1;i您可以将数字划分为特定范围的分区,然后使用线程查找这些间隔的除数并将它们添加到ArrayList中

假设您想找到10的除数。您可以将其拆分为[1,5]和[6,10]的间隔。然后使用两个线程并行计算除数


您也可以使用线程池。创建一个实现Runnable接口的类,并向构造函数中添加一个数字。使用run方法计算除数并将其添加到共享列表中。

是什么让您说它“不工作”的?非常大的数字…在循环中花费了很多时间。仍然没有给出预期的结果没有特别快速的方法来解决这个问题。您可以在sqrt(n)处停止,但没有真正有效的方法。
if(n%end==0){count=count+1;}
即使数字不是一个完美的正方形,也会加上一个,例如10的除数是1、2、5、10,但由于这是一个偶数(你总是加2,所以
计数
总是偶数)但是只有4个除数。你真的试过我的输入吗…即使这个方法花费很多时间,并且输出为64,这是不正确的。我给了你一个想法,尝试用大小数实现它。对于小数字,比如10,20,很好的想法,但问题完全是关于大数字,比如我提到的数字。这有什么意义你的回答你应该重复直到平方(n),它比第一个方法要快得多@Bastian schotetle思考起来有些道理。谢谢。不用担心!我相信我的第一个解决方案会更快,因为你可以通过线程数来加快计算过程。假设在一个线程中计算除数需要2分钟,如果你使用4个线程,它将ld只需要30秒。这当然取决于我们的系统。
int end = (int) Math.sqrt(x);
for(i=1;i<end;i++)
{
    if(n%i == 0 )
    {
          count=count+2;
    }

}
if(n%end == 0 && n*n==end){count=count+1;}
if(n%end == 0 && n*n!=end){count=count+2;}
System.out.println(count);