2016-06-12 22 views
-4

數字爲 n = 2747502308387844992 count = 0 正常方式(如使用for循環不起作用)。Java:以有效的方式找到非常大數量的因數總數

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

輸出要被打印爲。 建議我另一種高效的方式。 請在放入此處之前嘗試IDE中的解決方案。

+1

是什麼讓你說它「不工作」? – Arc676

+0

非常大的數字...在循環中花費大量時間。仍然沒有給出預期的結果 –

+0

有*是*沒有特別快速的方法來解決這個問題。你可以在sqrt(n)停下來,但是這不會是一個非常有效的方法。 –

回答

2

你可以devide數量成一定範圍的分區,然後使用線程來找到這些間隔的約數,並把它們添加到一個ArrayList。

假設您想查找10的除數。您可以將它分成[1,5]和[6,10]的區間。然後使用2個線程來並行計算除數。

您也可以使用線程池。創建一個實現Runnable接口的類並向構造函數添加一個數字。使用run方法計算除數並將其添加到共享列表。

+1

好的思維@Bastian Schoettle 讓人有些驚訝。謝謝。 –

+0

不用擔心!我確信我的第一個解決方案會更快,因爲您可以通過線程數加快計算過程。假設需要2分鐘來計算單個線程中的除數,如果使用4個線程,則只需要30秒。這當然取決於我們的系統。 –

0
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); 
+0

'if(n%end == 0){count = count + 1;}'即使數字不是一個完美的正方形, 10的除數是1,2,5,10,但由於這是一個偶數(你總是加2,所以'count'總是偶數),但只有4個除數。 – Arc676

+0

你真的嘗試了我的輸入......即使這種方法花費很多時間,並給出了64這是不正確的輸出。 –

+0

我給了你一個想法,嘗試使用BIGDECIMAL –

相關問題