數字爲 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中的解決方案。
數字爲 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中的解決方案。
你可以devide數量成一定範圍的分區,然後使用線程來找到這些間隔的約數,並把它們添加到一個ArrayList。
假設您想查找10的除數。您可以將它分成[1,5]和[6,10]的區間。然後使用2個線程來並行計算除數。
您也可以使用線程池。創建一個實現Runnable接口的類並向構造函數添加一個數字。使用run方法計算除數並將其添加到共享列表。
好的思維@Bastian Schoettle 讓人有些驚訝。謝謝。 –
不用擔心!我確信我的第一個解決方案會更快,因爲您可以通過線程數加快計算過程。假設需要2分鐘來計算單個線程中的除數,如果使用4個線程,則只需要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);
'if(n%end == 0){count = count + 1;}'即使數字不是一個完美的正方形, 10的除數是1,2,5,10,但由於這是一個偶數(你總是加2,所以'count'總是偶數),但只有4個除數。 – Arc676
你真的嘗試了我的輸入......即使這種方法花費很多時間,並給出了64這是不正確的輸出。 –
我給了你一個想法,嘗試使用BIGDECIMAL –
是什麼讓你說它「不工作」? – Arc676
非常大的數字...在循環中花費大量時間。仍然沒有給出預期的結果 –
有*是*沒有特別快速的方法來解決這個問題。你可以在sqrt(n)停下來,但是這不會是一個非常有效的方法。 –