C#均分算法问题

InSpirit1 2014-08-19 02:05:49
例如:八个苹果5人均分,最后默认前3个人每人2个,后2个人每人1个
实际情况苹果数和人数都是不定的,不过可确定苹果数一定大于等于人数。

int applenum = 8;
int peoplenum = 5;
int[] =people_num = new int[peoplenum];
for(int tmp =0; tmp < peoplenum; tmp++ )
{
people_num [tmp] = (int)((float)sum / peoplenum +0.5);
}

我现在只能想到这快了,不过问题很明显,分配到每个人的总数相加很容易与苹果总数不同。
请教编程思路
...全文
409 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zbdzjx 2014-08-19
  • 打赏
  • 举报
回复
假设M个苹果分给N个人。 M/N,整数部分为a。 M%N,余数为b。 结果就是:b个人的苹果数为a+1;N-b个人的苹果数为a。
InSpirit1 2014-08-19
  • 打赏
  • 举报
回复
引用 12 楼 Linux7985 的回复:

			int appleTotal = 8;
			int peopleTotal = 5;
			var people = new int[5];
			var avg = appleTotal / peopleTotal;
			var another = appleTotal % peopleTotal;
			for (var i = 0; i < peopleTotal; i++)
			{
				people[i] = avg;		// 每个人平均avg个
				if (i < another)
					people[i] += 1;		// 前another个每个多一个.
			}
写的还挺快!
烈火蜓蜻 2014-08-19
  • 打赏
  • 举报
回复

			int appleTotal = 8;
			int peopleTotal = 5;
			var people = new int[5];
			var avg = appleTotal / peopleTotal;
			var another = appleTotal % peopleTotal;
			for (var i = 0; i < peopleTotal; i++)
			{
				people[i] = avg;		// 每个人平均avg个
				if (i < another)
					people[i] += 1;		// 前another个每个多一个.
			}
我叫小菜菜 2014-08-19
  • 打赏
  • 举报
回复
引用 6 楼 InSpirit1 的回复:
[quote=引用 4 楼 xyl2902 的回复:] [quote=引用 2 楼 InSpirit1 的回复:] [quote=引用 1 楼 xyl2902 的回复:] 先每人一个,再每人一个……没了为止
苹果自减的同时人自增?是个办法,不过消耗资源略多,数量上百上千,多调用几次就不太好了[/quote]其实就是除一下,余下的苹果随便分[/quote]这个可以,先除后均分整数,再将余数加到头几名[/quote] 果断是这个,先尽可能平分,最后把零头随便分。 “先每人一个,再每人一个……没了为止”这样太慢了,结果和上面的一样。 比如 苹果数:n=a*m+b; (0<=b<m) 人数 :m 显然最后解雇,b个人有(a+1)个苹果,(m-b)个人具有a个苹果。
於黾 2014-08-19
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380 的回复:
额,“找公主,数猴子,算星期几”不知道你做过几道题没有 for(int i=0 ;i<苹果数;i++) { 人[i%人数]+=1; }
额,数星星用这个算法就太慢了点...
於黾 2014-08-19
  • 打赏
  • 举报
回复
两种思想 1.先M个苹果平均分成N份,向下取整,然后余下的再分一次 2.一个人一个人的分 比如有5个人,第一个人先拿1/5(+1),第二个人拿剩下的1/4(+1)...
wanghui0380 2014-08-19
  • 打赏
  • 举报
回复
额,“找公主,数猴子,算星期几”不知道你做过几道题没有 for(int i=0 ;i<苹果数;i++) { 人[i%人数]+=1; }
於黾 2014-08-19
  • 打赏
  • 举报
回复
其实有循环一次就得到结果的办法 比如N个人,M个苹果 先S=M/N,向上取整 再S=(M-S)/(N-1),依然向上取整 最终总有能除尽的时候
InSpirit1 2014-08-19
  • 打赏
  • 举报
回复
引用 4 楼 xyl2902 的回复:
[quote=引用 2 楼 InSpirit1 的回复:] [quote=引用 1 楼 xyl2902 的回复:] 先每人一个,再每人一个……没了为止
苹果自减的同时人自增?是个办法,不过消耗资源略多,数量上百上千,多调用几次就不太好了[/quote]其实就是除一下,余下的苹果随便分[/quote]这个可以,先除后均分整数,再将余数加到头几名
bw555 2014-08-19
  • 打赏
  • 举报
回复
把你代码中的 (int)((float)sum / peoplenum +0.5) 改为 math.ceiling((float)sum / peoplenum) 即可
Satroki 2014-08-19
  • 打赏
  • 举报
回复
引用 2 楼 InSpirit1 的回复:
[quote=引用 1 楼 xyl2902 的回复:] 先每人一个,再每人一个……没了为止
苹果自减的同时人自增?是个办法,不过消耗资源略多,数量上百上千,多调用几次就不太好了[/quote]其实就是除一下,余下的苹果随便分
bw555 2014-08-19
  • 打赏
  • 举报
回复
一个人一个人处理 假设苹果n个,人数m
循环处理每个人{
        剩余苹果树除以剩余人数,结果向上取整,按结果获得的整数分给下一个人
}
InSpirit1 2014-08-19
  • 打赏
  • 举报
回复
引用 1 楼 xyl2902 的回复:
先每人一个,再每人一个……没了为止
苹果自减的同时人自增?是个办法,不过消耗资源略多,数量上百上千,多调用几次就不太好了
Satroki 2014-08-19
  • 打赏
  • 举报
回复
先每人一个,再每人一个……没了为止

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧