`
javatgo
  • 浏览: 1120178 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

2005年5月2日第17期电脑报编程点将(转载)

阅读更多
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;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics