2005年5月2日第17期电脑报编程点将
题目:十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小
孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个
小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问
经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖?
我的程序:(这道题在我的c语言程序设计百例里面的第75题)
/*这道题看起来简单,但是其实要一次完全做完整不不是很容易。
当然,这题目本身就有点歧义:起初我是这样理解的:第一个人把一半糖给第二个人,
然后第二个人检查一下糖是不是偶数,不是的话就再要一个糖,
然后再把总的糖分一半给第三个……后来发现这样做没有答案。
我的答案和获奖程序一基本上是一样的,主要的不同点在我的程序的注释的部分。
算法的思路比较简单就不分析了。
*/
#include<iostream>
using namespace std;
void main()
{
const int n=10;
int child[n]={10,2,8,22,16,4,10,6,14,20};
int temp,i,count=0;
bool tag=true;//标志分配完后是否每个数值都是相等的,相等时为false,不等时为true
while(tag)
{
count++;
tag=false;
temp=child[n-1];//获奖程序把这句放在这个循环的最外面,
//我觉得这个就没有所谓的分配次数可言的,我把这个放在里层循环的外面
//在外层循环的里面是说明已经经过了一次分配,现在是另一次分配,这是重新初始化
for(i=0;i<n-1;i++)
{
child[i]=child[i]/2+temp/2;
temp=(child[i]-temp/2)*2;
if(child[i]%2==1)child[i]++;
}
for(i=0;i<n-1;i++)
if(child[i]!=child[i+1])
{
tag=true;
break;
}
}
cout<<"经过"<<count<<"次后大家手中的糖的块数一样多\n"
<<"大家手中的糖的块数都是:"<<child[0]<<endl;
}
获奖程序一:
#include <stdio.h>
#include <conio.h>
main()
{int a[10]={10,2,8,22,16,4,10,6,14,20};
int i,flag=0,t=0,temp=20;
while (flag==0)
{for (i=0;i<=9;i++)
{a[i]=a[i]/2+temp/2;
temp=(a[i]-temp/2)*2;
if (a[i]%2==1) a[i]++;
}
t++;
flag=1;
for (i=0;i<=8;i++)
if (a[i]!=a[i+1]) {flag=0;break;};
}
printf("%dtimes,number=%d\n",t,a[0]);
getch();
}
获奖程序二:
//数据结构: 十个小孩采用数组的存储结构
//算法描述: 对数组进行操作,将前驱节点的值的1/2与该节点的值的1/2相加,如果为奇数,就加1。依
次进行下去直到各节点值相等。
#include<iostream>
using namespace std;
struct node
{
int oldnum;//用来记录分糖前每个小朋友手中的糖果数
int newnum;//用来记录又一次分糖后每个小朋友手中的糖果数
};
void main()
{
node child[10];
int count=0;
// 以下进行数组的初始化。
child[0].oldnum=10;child[0].newnum=0;
child[1].oldnum=2;child[1].newnum=0;
child[2].oldnum=8;child[2].newnum=0;
child[3].oldnum=22;child[3].newnum=0;
child[4].oldnum=16;child[4].newnum=0;
child[5].oldnum=4;child[5].newnum=0;
child[6].oldnum=10;child[6].newnum=0;
child[7].oldnum=6;child[7].newnum=0;
child[8].oldnum=14;child[8].newnum=0;
child[9].oldnum=20;child[9].newnum=0;
//以下是算法的实现
while (!(child[0].oldnum==child[1].oldnum&&child[1].oldnum==child[2].oldnum&&child
[2].oldnum==child[3].oldnum&&child[3].oldnum==child[4].oldnum&&child[4].oldnum==child
[5].oldnum&&child[5].oldnum==child[6].oldnum&&child[6].oldnum==child[7].oldnum))
{
int i=1;
while (i<11)
{
child[i%10].newnum=(child[i%10].oldnum+child[(i-1)%10].oldnum+1)/2;
//进行重新分配,并进行从新赋值。
i++;
}
i=1;
while (i<11)
{
child[i%10].oldnum=child[i%10].newnum;
i++;
}
count++;
}
cout<<"分糖次数:"<<count<<endl;
cout<<"每个小朋友手中的糖果数:"<<child[0].oldnum;
}
分享到:
相关推荐
目前最新电脑报2019年第6期,报纸日期2018年2月18日。
目前最新电脑报2019年第5期,报纸日期2018年2月11日。
目前最新电脑报2019年第2期,报纸日期2018年01月14日。
《电脑报》于1992年1月3日由西南大学、重庆市科协正式创刊出版。 ,是西南大学、重庆市科协主办和主管的计算机周报。
目前最新电脑报2019年第34期,报纸日期2019年9月2日。
电脑报2014年2月17日第6期,PDF版。
《电脑报》 2013年第2期 pdf
目前最新电脑报2019年第7期,报纸日期2018年2月25日。
目前最新电脑报2018年第26期,报纸日期2018年7月2日。
《电脑报》2014年2月24日第7期,PDF版。
《电脑报》2016年第2期PDF版
电脑报2015第2期 ,新一期的电脑报,新的行业发展
电脑报 电脑报阅读系统 电脑报合订本 电脑报电子版 电脑报阅读系统2008
电脑报2013年第29期 分卷压缩的资源 源自网络
电脑报 2012合订本 (精简版) 电脑报2013 电脑报2012合订本(精简版).part1.rar 电脑报2012合订本(精简版).part2.rar 2013年阅读经典 值得一看!
《电脑报》2013年第9期,电子版。格式为pdf。 《电脑爱好者》 2013年第1期http://download.csdn.net/detail/puma1349/5099316 2013年第2期http://download.csdn.net/detail/puma1349/5099338 2013年第3期...
《电脑报》2013年第8期,电子版。格式为pdf。1-7下载地址 2013年第1期http://download.csdn.net/detail/puma1349/5099399 2013年第2期http://download.csdn.net/detail/puma1349/5099234 2013年第3期...
电脑报2019年2月合集共3期,PDF格式,高清无广告,含2019年第5、6、7期。
适用于办公室学校家庭的科普报邮发代号:77192021 年 8 月 2 日第 30 期总第 1514 期手机淘宝扫一扫立即订阅《电脑报》电子版买一送一微信扫一扫
电脑报2012合订本(上册)高清扫描版图书,分为四个压缩包,这个是4个 为啥不能上传大文件啊,累...电脑报2012合订本(上册)高清.part2.rar 电脑报2012合订本(上册)高清.part3.rar 电脑报2012合订本(上册)高清.part4.rar