麻烦各位c语言高手帮忙看看我写的程序错在哪里

10个小孩围成一圈分糖,老师分给第1个孩子10块,第2个孩子2块,第3个孩子8块,第4个孩子22块,第5个孩子16块,第6个孩子4块,第7个孩子10块,第8个孩子6块,第... 10个小孩围成一圈分糖,老师分给第1个孩子10块,第2个孩子2块,第3个孩子8块,第4个孩子22块,第5个孩子16块,第6个孩子4块,第7个孩子10块,第8个孩子6块,第9个孩子14块,第10个孩子20块,然后所有的小孩同时将自己手中的糖分一半给右边的小孩,糖块数为奇数的人可向老师再要一块。问经过这样几次调整后大家手中的糖的块数都一样?每人各有多少块糖。(注:第i个小朋友的右边是第i-1个小朋友,第1个小朋友的右边是第10个小朋友)
程序:
#include<stdio.h>
main()
{
int a[10]={10,2,8,22,16,4,10,6,14,20};
int i,k=0;
do
{
for(i=9;i>0;i--)
{
a[i-1]+=a[i]/2;
if(a[i-1]%2!=0)a[i-1]+=1;
if(a[i]%2!=0)a[i]+=1;
}
a[9]+=a[0]/2;
if(a[0]%2!=0)a[0]+=1;
if(a[9]%2!=0)a[9]+=1;
k++;
}while(a[0]==a[1]==a[2]==a[3]==a[4]==a[5]==a[6]==a[7]==a[8]==a[9]);
printf("%d %d",k,a[0]);
}
这个是我写的程序,但是运行的结果很明显是错的,麻烦各位高手帮忙看看是错在哪里,怎么改,小弟在此先谢过哈
展开
 我来答
zzu_liuwei
2012-02-01 · TA获得超过372个赞
知道小有建树答主
回答量:200
采纳率:0%
帮助的人:224万
展开全部
首先简单分析一下:
孩子1先分出去自己的一半糖后再接收孩子2给的一半糖,此时分出去的是孩子1原先的一半糖,注意此时分出去的是孩子1还没慎谈有分之前的一半,而得到的糖是孩子2还没有分裤孝余之前的一半,而不是孩子2得胡滚到孩子3一半糖后孩子2糖总数的一半,不知道听明白没,呵呵,所以另用一数组存放还没有进行分糖之前的数量。
int main(void)
{
int a[10]={10,2,8,22,16,4,10,6,14,20},b[10];
int i,k=0;
do
{
for(i=0;i<10;i++)
{
b[i] = a[i];
a[i] /= 2;
}
for(i=0;i<9;i++)
a[i] += b[i+1]/2;
a[9] += b[0]/2;
for(i=0;i<10;i++)
if(a[i]%2 != 0)
a[i] += 1;
k++;
}while((a[0]!=a[1])||(a[0]!=a[2])||(a[0]!=a[3])||(a[0]!=a[4])||(a[0]!=a[5])||(a[0]!=a[6])||(a[0]!=a[7])||(a[0]!=a[8])||(a[0]!=a[9]));
printf("%d %d",k,a[0]);
return 0;
}
yinjinmi
2012-02-01 · 超过66用户采纳过TA的回答
知道答主
回答量:120
采纳率:0%
帮助的人:194万
展开全部
if(a[i]%2!=0)a[i]+=1; //磨弊 a[9]的值在加上a[0]的值的一半以前已经改变了可能,这句应该放在a[9]的值变新值以后再判断是差羡不是奇数

#include<瞎庆族stdio.h>
main()
{
int a[10]={10,2,8,22,16,4,10,6,14,20};
int i,k=0;
do
{
for(i=9;i>0;i--)
{
a[i-1]+=a[i]/2;
if(a[i-1]%2!=0)a[i-1]+=1;
//a[i]就是上一轮的a[i-1],已经判断过无需再判断
}
a[9]+=a[0]/2;
//if(a[0]%2!=0)a[0]+=1; a[0]已经判断过了
if(a[9]%2!=0)a[9]+=1;
k++;
}while(a[0]==a[1]==a[2]==a[3]==a[4]==a[5]==a[6]==a[7]==a[8]==a[9]);
printf("%d %d",k,a[0]);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
frowmax
2012-02-07 · TA获得超过201个赞
知道小有建树答主
回答量:176
采纳率:50%
帮助的人:52.8万
展开全部
/////////////////////////////////////////////////////////////////////////////////////////////
分析:程序强调了是所有小孩“同时”交给右侧同学一半糖,
不是“依次”交给右侧同搭皮学,所以分出来的一半存入数组b是
最清晰的思路。程序如下:
/////////////////////////////////////////////////////////////////////////////////////////////
#include "stdio.h"
void main(void)
{
int a[10]={10,2,8,22,16,4,10,6,14,20};
int b[10]={0,0,0,0,0,0,0,0,0,0};
int i=0,j=0,k=0;
do
{
// 找老师要糖,且分一半出来存入数组b:
for(i=9;i>=0;i--)
{
if( (a[i]&0x01)==1 )a[i]++;
b[i]=a[i]/2;
a[i]=b[i];
}

// 将分成半数的糖交给右侧同学:
for(i=9;i>=0;i--)
{
j=((i+1)>9?0:(i+1));
a[i]=a[i]+b[j];
}
k++;
}while(a[0]!=a[1]||a[0]!=a[2]||a[0]!=a[3]
||a[0]!=a[4]||a[0]!=a[5]||a[0]!=a[6]
||a[0]!=a[7]||a[0]!=a[8]||a[0]!=a[9]);

printf("%d,%d",k,a[0]);
}

////////////////////////知枯差/////////////////////////////////////////////////////////////////////
输出败歼结果:17,18
即需要交换 17 趟,最后每个同学手里 18 粒糖。

/////////////////////////////////////////////////////////////////////////////////////////////
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yutou0113
2012-02-01
知道答主
回答量:40
采纳率:0%
帮助的人:12.5万
展开全部
while(a[0]==a[1]==a[2]==a[3]==a[4]==a[5]==a[6]==a[7]==a[8]==a[9]);
建议写成相与的格巧档念式while(a[0]&a[1]&a[2]&a[3]&a[4]&a[5]&a[6]&a[7]&a[8]&a[9]);
printf("%d %d",k,a[0]);
中K应该写成&k吧!
逻辑孝困是否有错,还没研究,呵呵!蠢喊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式