我们给了一个数字,比方说m。我们必须将数字分配到n个部分

时间:2017-02-09 19:03:57

标签: arrays algorithm

Lets说我有一个号码m = 9。我想把它分成n=5部分,如下所示:

作为m>n,每个部分至少会获得1

首先向所有1 5

提供parts

part0:1, part1:1, part2:1, part3:1, part4:1

现在从第1开始再次为剩余的(9 - 5 = 4)除。最终分配如下:

part0:2 part1:2 part2:2 part3:2 part4:1

ALGO: 取一个数组arr[n]={0}

x=0
while(m) {
   arr[x]+=1;
   m--;
   x=(x+1)%n;
}

我的问题是我不想运行这个循环来将n分成m个部分。在数学上,我如何知道直接分配给零件的值。即上面例子中的part0:2。

2 个答案:

答案 0 :(得分:1)

整数除法可以获得所有部分的“基本”大小:9 / 5 == 1

Modulo为您提供余数9 % 5 == 4。这意味着您应该在第一个4部分添加1。

int partCount = 5;
int number = 9;

int base = number / partCount;
int remain = number % partCount;

for (int i=0; i<partCount; i++) {
    part[i] = base;
    if (i < remain) part[i]++;
}

如果使用更大的数字,算法可能会更清晰。例如。 31分7部分:

31 / 7 == 4 - 所以我们有7个部分,每部分4个,(== 28)加上余数:
31 % 7 == 3 - 将前3个部分分别增加1个,共计31个。

答案 1 :(得分:0)

for (i=0; i<n; i++) {
  arr[i] = m/n + (m%n < i ? 1 : 0);
}