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。
答案 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);
}