【问题标题】:Java : finding the total number of divisors for a very large number in an efficient way [duplicate]Java:以有效的方式找到一个非常大的除数的总数[重复]
【发布时间】:2016-06-12 11:41:19
【问题描述】:

号码是 n = 2747502308387844992 计数 = 0 使用 for 循环之类的正常方法不起作用。

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

要打印的输出是 10240。 建议我另一种有效的方式。 请在 IDE 中尝试解决方案,然后再放这里。

【问题讨论】:

  • 是什么让你说它“不起作用”?
  • 非常大的数字...在循环中花费大量时间。仍然没有给出预期的结果
  • 没有解决这个问题的特别快速的方法。您可以在 sqrt(n) 处停下来,但这不会是一种真正有效的方法。

标签: java


【解决方案1】:

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

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

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

【讨论】:

  • 很好的想法@Bastian Schoettle 有点意思。谢谢。
  • 别担心!我确信我的第一个解决方案会更快,因为您可以通过线程数加快计算过程。假设在单个线程中计算除数需要 2 分钟,如果使用 4 个线程,则只需 30 秒。这当然取决于我们的系统。
【解决方案2】:
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);

【讨论】:

  • if(n%end == 0 ){count=count+1;} 即使数字不是完美的正方形,这也会加一,例如10 的除数是 1、2、5、10,但因为这是一个偶数(你总是加 2,所以count 总是偶数)但只有 4 个除数。
  • 你真的尝试过我的输入吗......即使这种方法需要很多时间并且输出为 64 也是不正确的。
  • 我给了你一个想法,尝试使用 BIGDECIMAL 实现它
  • 对于像 10,20 这样的小数字来说是个好主意,但问题完全是关于像我提到的数字这样的大数字......你的答案有什么意义
  • 你应该迭代直到 square(n) ,它比第一种方法更快速
猜你喜欢
  • 1970-01-01
  • 2013-10-21
  • 2015-07-16
  • 2014-08-01
  • 2019-06-12
  • 2016-12-06
  • 2016-09-18
  • 2015-12-01
  • 1970-01-01
相关资源
最近更新 更多