整数除法

时间:2018-08-19 10:41:16

标签: java algorithm math numbers double

如何将数字分为相等的部分或尽可能接近相等的部分。参见下面的示例:

如果我要在两组之间分配的值为61,则该值为30.5和30.5。双精度(十进制)不好,因此在这方面最接近的分隔是30和31。

类似地,42/5 = 8.4,但是我需要系统返回(8、8、8、9、9)这是与整数最接近的拆分。

解决了他们:

        if(sum % numberOfTeams != 0) {
        al.add(0, sNOT);
    for(int i = 0; i < numberOfTeams - 1;  i++) {
        int remover = sum - sNOT;
        if(remover % (sNOT + 1) == 0) {
            al.add(i+1, sNOT + 1);
        }else {
         al.add(i + 1, sNOT);

        }

     }
}

}

4 个答案:

答案 0 :(得分:4)

这是一个完全使用ScrollView的解决方案,它略短一些,没有循环。有效性检查也应按照上述建议进行

Map<String, Integer> currencyValueMap = new HashMap<>();
for (int i=0; i<denom.length; i++) {
    currencyValueMap.put(denom[i], (k, v) v == null ? count[i] : count[i] + v);
}

答案 1 :(得分:3)

这是一种解决方案:

public static int[] closestSplit(int intToSplit, int noOfGroups) {

    int[] result = new int[noOfGroups];
    Arrays.fill(result, intToSplit / noOfGroups);
    for (int i = 0; i < intToSplit % noOfGroups; i++) {
        result[i]++;
    }
    return result;

}


// usage:
System.out.println(Arrays.toString(closestSplit(42, 5)));

基本上,它首先创建一个长度为noOfGroups的数组,然后用intToSplitnoOfGroups的整数除来填充它。接下来,将一个添加到数组的前intToSplit mod noOfGroups个元素。

如果您要求结果按升序排列,则可以从数组末尾循环或使用Arrays.sort

答案 2 :(得分:1)

解决此问题时需要考虑的主要事情是余数。

在上面的示例中,我们打算将61分成2,61 / 2给出余数 1 。由于我们分为两组,因此这两个组中只有一个必须为((int) 61 / 2) + 1。其余(一个)组可以是((int) 61 / 2)

另外,请考虑将42分为5,42 / 5得到的余数为 2 。由于我们分为5个组,因此这5个组中只有2个必须为((int) 42 / 5) + 1。其余(三个)组可以为((int) 42 / 5)

代码如下:

public int[] spitNumbers(int number, int groups){

    int[] result = new int[groups];  //The array we'd return at the end

    int shift = number % groups;  //I used this to check the remainder.

    for(int i = 0; i < result.length; i++){

    /* The if-statement below checks for two things:
       - if the remainder is zero
       - if we've reached the shifting stage.
    */
        if((shift == 0) || (i < shift)){
            result[i] = number / groups;
        }

    // The else statement starts being fired when the shifting stage has been reached.

        else{
            result[i] = (number / groups) + 1;
        }
    }
    return result;
}

我希望这会有所帮助。.编码愉快!

答案 3 :(得分:-1)

请稍作测试,看看这个解决方案,它可以工作。

public static int[] number(int number, int divider) {
    if (number == 0 || number < divider) {
        return new int[]{0};
    }
    if (number == 1 || number == divider) {
        return new int[]{1};
    }
    double r = (double) number / divider;
    int upperCount = number % divider;
    return IntStream.range(0, divider).map(i ->{
        if (i < upperCount) {
            return (int) Math.ceil(r);
        }
        return (int) Math.floor(r);
    }).toArray();
}

p.s。简化了