正文

2005年5月2日第17期电脑报编程点将2005-09-10 21:15:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xiangyu/4642.html

分享到:

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; }     

阅读(15837) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册