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;
}
正文
2005年5月2日第17期电脑报编程点将2005-09-10 21:15:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/xiangyu/4642.html
阅读(4351) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论