麻烦各位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]);
}
这个是我写的程序,但是运行的结果很明显是错的,麻烦各位高手帮忙看看是错在哪里,怎么改,小弟在此先谢过哈 展开
程序:
#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]);
}
这个是我写的程序,但是运行的结果很明显是错的,麻烦各位高手帮忙看看是错在哪里,怎么改,小弟在此先谢过哈 展开
4个回答
展开全部
首先简单分析一下:
孩子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;
}
孩子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;
}
展开全部
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]);
}
#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]);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/////////////////////////////////////////////////////////////////////////////////////////////
分析:程序强调了是所有小孩“同时”交给右侧同学一半糖,
不是“依次”交给右侧同搭皮学,所以分出来的一半存入数组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 粒糖。
/////////////////////////////////////////////////////////////////////////////////////////////
分析:程序强调了是所有小孩“同时”交给右侧同学一半糖,
不是“依次”交给右侧同搭皮学,所以分出来的一半存入数组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 粒糖。
/////////////////////////////////////////////////////////////////////////////////////////////
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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吧!
逻辑孝困是否有错,还没研究,呵呵!蠢喊
建议写成相与的格巧档念式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吧!
逻辑孝困是否有错,还没研究,呵呵!蠢喊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询