2013-07-29 37 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; 
    } 
}