将数字分成大小相似的块

时间:2019-07-18 13:12:37

标签: java math

我需要将数字分成大小相似的块。我有两个变量 ,分别是数量和所需的单独块的数量。

例如,如果我想将120分成5个块,则好的输出可能是:0-24、25-49、50-74、75-99、100-120。

块的大小不必完全相同,如果它们相似也可以,但它们必须完全分开,即两个块中不能有数字。

我已经检查了其他答案,例如this,但它们并没有完全分开,因此无法使用。

这是我的Java代码:

    int maxIndex = 10;
    int numberOfChunks= 5;
    int chunkSize =new Double( Math.floor( ((double)maxIndex) / numberOfChunks)).intValue();

    int counter=0;
    for (int i=0; i<numberOfChunks;i++) {
        int min = counter;
        int max = counter+chunkSize;
        if (i==numberOfChunks-1) max=maxIndex;
        counter+=chunkSize+1;
        System.out.println(min + " - " + max);

    }

由于该数字为“ +1”,因此不适用于小数字。 错误输出的示例是:

0-2

3-5

6-8

9-11

12-10

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

假设我正确阅读了您的问题,并且有效的块列表为{0-1、2-3、4-5、6-7、8-10},我想您可以使用一些小的修改。像这样:

int maxIndex = 10;
int numberOfChunks= 5;
int chunkSize =new Double( Math.floor( ((double)maxIndex) / numberOfChunks)).intValue();

int counter = 0;
for (int i = 0; i < numberOfChunks; i++) {
    int min = counter;
    int max = counter + chunkSize - 1;
    if (i == numberOfChunks - 1) {
        max = maxIndex;
    }
    counter += chunkSize;
    System.out.println(min + " - " + max);

}

答案 1 :(得分:1)

按原样使用chunkSize,就不算0。这意味着您在初始化最大值时应减去一个。

int maxIndex = 10;
int numberOfChunks= 5;
int chunkSize =new Double( Math.floor( ((double)maxIndex) / numberOfChunks)).intValue();

int counter=0;
for (int i=0; i<numberOfChunks;i++) {
    int min = counter;
    int max = counter+chunkSize-1;
    if (i==numberOfChunks-1) max=maxIndex;
    counter+=chunkSize; //Get rid of the +1
    System.out.println(min + " - " + max);

}

答案 2 :(得分:0)

一种已评论的解决方案,明确使用最多2个相距1的块大小:

int count = maxIndex+1; // actual number of values to distribute
int size = new Double( Math.floor( ((double)maxIndex) / numberOfChunks)).intValue();  // minimum amount to put in each range
int extra = count - size*numberOfChunks;  // values left after minimums used
int i = 0; // start of current range
while (i <= maxIndex) {
    int j = i+size; // end of current range, assuming an extra is included
    if ( extra > 0 ):
        extra -= 1; // we've used one of our extras
    else:
        j -= 1;     // "remove" the extra we optimistically included
    System.out.println(i + " - " + j);
    i = j+1;  // start next range just after this one
}