2013-07-29 38 views
0

我有以下代碼有循環輸出數字組?

for (int k=0; k<maxThreads; k++) { 
     int firstpart = k * tasksPerThread; 
     int secondpart = ((k+1) * tasksPerThread) - 1; 
     System.out.println(firstpart + "," + secondpart); 
    } 

凡maxThreads是由用戶輸入的和tasksPerThread是10/maxThreads。 MaxThreads永遠不會小於1.這會輸出數字對。例如,如果maxThreads = 2(製備tasksPerThread = 5)然後將其輸出

0,4 
5,9 

涵蓋所有十個值0-9

我想覆蓋所有十個值如果maxThreads = 4眼下代碼輸出

0,1 
2,3 
4,5 
6,7 

但我想覆蓋0-9。因此,理想的情況下將輸出

0-2 
3-5 
6-7 
8-9 

還是真的有套數字maxThreads數量和覆蓋0-9的任意組合。我如何調整for循環來做到這一點?

謝謝。

+0

對不起我的錯誤。我編輯了這個問題,以避免5次寫入。 – user760220

回答

1

它正在向下取整我認爲,嘗試使用天花板。

+0

以及我只希望它輸出四個(或任何數量的maxthreads是)數字集。然而,四套必須覆蓋0-9 – user760220

+1

是的,我意識到這一點,改變了我的答案。 – Bojan

1

在這種情況下,您必須在tasksPerThread變量中多采用一個線程。您將其計算爲10/maxThreads,但您需要將天花板應用於此。

int tasksPerThread = Math.ceil(10/(double) maxThreads); 

請注意,你必須得到maxThreads爲double,因爲如果你把它當作一種int,股利結果將永遠是一個int

這應做到:

int tasksPerThread = Math.ceil(10/(double) maxThreads); 
for (int k=0; k<maxThreads; k++) { 
    int firstpart = k * tasksPerThread; 
    int secondpart = ((k+1) * tasksPerThread) - 1; 
    System.out.println(firstpart + "," + secondpart); 
} 
+0

對不起,你認爲天花板是什麼意思? – user760220

+0

如果該值不完全是整數值,則表示要四捨五入。例如,如果div結果是2.1,它將轉到每個線程3個任務,這是您需要的。對於最後一個線程,只包括你有剩餘的任務。 –

+0

謝謝。它現在顯示0,2 3,5 6,8 9,11但是,如果可能,我希望它停在9。我將如何做到這一點? – user760220

1

你可以這樣做:

for (int k = 0; k < maxThreads; k++) { 
    int firstpart = (int) (k * tasksPerThread); 
    int secondpart = (int) (((k + 1) * tasksPerThread) - 1); 
    System.out.println(firstpart + "," + secondpart); 
} 

其中tasksPerThread計算如下:

double tasksPerThread = 10.0/maxThreads; 

或等價

double tasksPerThread = 10/(double) maxThreads; 
+0

'tasksPerThread'不能獲得'double'範圍值,否則結果可能會得到小數。你不能在一個線程中完成一半的任務,不是嗎? –

+0

我們將所有最終結果轉換爲int,所以不會有任何小數。 – SamYonnou

1

此代碼將瓜分N個任務maxThreads線程之間:

public static void schedule(int n, int maxThreads) { 
    int tasksPerThread = (n + maxThreads - 1)/maxThreads; 
    int nExtra = tasksPerThread * maxThreads - n; 
    int nFull = tasksPerThread * (maxThreads - nExtra); 
    int start = 0; 
    while (start < nFull) { 
     int end = start + tasksPerThread - 1; 
     System.out.printf("%1$d,%2$d%n", start, end); 
     start = end + 1; 
    } 
    while (start < n) { 
     int end = start + tasksPerThread - 2; 
     System.out.printf("%1$d,%2$d%n", start, end); 
     start = end + 1; 
    } 
}