有循环输出数字集?

时间:2013-07-29 18:12:17

标签: java for-loop

我有以下代码

    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循环来执行此操作?

谢谢。

4 个答案:

答案 0 :(得分:1)

我认为它正在向下舍入,尝试使用天花板。

答案 1 :(得分:1)

在这种情况下,您必须在tasksPerThread变量中更多地使用一个线程。您将其计算为10/maxThreads,但您需要对其应用上限

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

请注意,您必须将maxThreads作为双倍,因为如果将其视为int,则div结果将始终为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);
}

答案 2 :(得分: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;

答案 3 :(得分:1)

此代码将在maxThreads个线程中划分n个任务:

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;
    }
}