我有一组排序的人,我想分配一个定义的计数自上而下。 例如:
情景:
int i = 8;
personA = 0;
personB = 0;
personC = 0;
期望的结果:
personA = 3;
personB = 3;
personC = 2;
当然我可以使用for / while循环进行迭代,但如果i
非常大,可能效率低下。
结果也可以通过devision获得,没有循环吗?
伪代码:
distributed = 0;
while (distributed < i) {
for (int p : persons) {
p++;
distributed++;
}
}
互动步骤:
1-1-1 > start over > 2-2-2 > start over > 3-3-2
答案 0 :(得分:3)
是的,当然有可能。由于您没有给出任何特定的实现,我只是将数字放在一个数组中。当然,这只是一个示范。假设NUM_OF_PERSONS是数组中的人数,NUM_TO_DISTRIBUTE是您要分发的数字。在你的例子中,8。
int persons[] = new int[NUM_OF_PERSONS];
int basicRation = NUM_TO_DISTRIBUTE / NUM_OF_PERSONS;
int peopleGettingExtra = NUM_TO_DISTRIBUTE % NUM_OF_PERSONS;
for ( int i = 0; i < NUM_OF_PERSONS; i ++ ) {
persons[i] = basicRation + ( i < peopleGettingExtra ? 1 : 0 );
}
测试案例1:9给3人。基本比率为3.获得额外的人数为零。在循环中,由于没有i
小于0,所以每个人都会得到basicRation + 0
,这意味着3。
测试案例2:8给3人。基本比率是2.获得额外的人数是2.在循环中,索引0和1的人将获得2 + 1,最后一个人获得2 + 0。
答案 1 :(得分:2)
distributed = 0;
int howManyForEach = (int)(i/persons.size())
for(int p : person){
p = howManyForEach ;
}
distrubuted = howManyForEach * persons.size();
while (distributed < i) {
for (int p : persons) {
p++;
distributed++;
}
}
答案 2 :(得分:2)
以下代码将运行 i = 8 5次, i = 10 4次,随着我的增加,执行的时间循环次数成比例地减少强>
int i = 10;
int[] arr = new int[3] { 0, 0, 0 };
int BaseVal = i / (arr.Length);
int Remainder = i - (BaseVal * arr.Length);
for (int x = 0; x < arr.Length ;x++)
{
arr[x] = BaseVal;
}
for (int y = 0; y < Remainder; y++)
{
arr[y] = arr[y] + 1;
}
答案 3 :(得分:1)
从问题中可以清楚地看出,任何人之间的最大差异是1
。
只需使用#persons / i = base value for every person
和#persons % i = # top persons with +1 value
示例强>
i = 5 , persons = 3:
baseValue = 1
#topPersons = 2
=> 2 2 1