材料力学挠度表:C语言基础问题求救!帮我看看错在哪里~

来源:百度文库 编辑:中科新闻网 时间:2024/04/29 23:43:12
十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩(例如第一个小孩分给第二个小孩,以此类推);糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖?

main()
{static int a[10]={10,2,8,22,16,4,10,6,14,20};
int m,n,i,s=0;
for(m=0;s!=1;m++)
{for(i=0;i<10;i++);
{if((a[i]%2)!=0) a[i]=a[i]+1;
if(i==9) {a[i]=0.5*a[i];a[0]=a[0]+0.5*a[i];}
else {a[i]=0.5*a[i];a[i+1]=a[i+1]+0.5*a[i];}
}
for(i=0;i<9;i++);
if(a[i]!=a[i+1]) break;else s=1;
}
n=a[0];
printf("After<%d>times,every child has<%d>candys.",m,n);

}
抱歉,我不是要其它更优的程序;是希望高手指点一下我的问题在哪里...

1.你对题目理解错了.是同时分一半糖给后面一个人.按你的程序是第i+1人得到第i人的一半糖后再分第i+2人
2.有几个for后多了分号
3.循环终止条件不对.if(a[i]!=a[i+1]) break;else s=1; 只要有一个a[i]和a[i+1]相等,总循环就终止了

这是我改的程序,b[i]是用来同时分糖的

main()
{static int a[10]={10,2,8,22,16,4,10,6,14,20},b[10]={0};
int m,n,i,s=0;
for(m=0;s!=9;m++)
{s=0;
for(i=0;i<10;i++)
{if((a[i]%2)!=0) a[i]=a[i]+1;}
for(i=0;i<10;i++)
{a[i]/=2;b[i]=a[i];}
for(i=0;i<10;i++)
if(i==9) a[0]=a[0]+b[i];
else a[i+1]=a[i+1]+b[i];

for(i=0;i<9;i++)
if(a[i]==a[i+1]) s++;
}
n=a[0];
printf("After<%d>times,every child has<%d>candys.",m,n);

}

main()
{static int a[9]={10,2,8,22,16,4,10,6,14,20}; //数组从“0”开始
int m,n,i,s=0;
for(m=0;s!=1;m++)
for(i=0;i<10;i++) //去掉“{” 和“;”
{if((a[i]%2)!=0) a[i]=a[i]+1;
else if(i==9) {a[i]=0.5*a[i];a[0]=a[0]+0.5*a[i];} //应该使用“else if”
else {a[i]=0.5*a[i];a[i+1]=a[i+1]+0.5*a[i];}
}
for(i=0;i<9;i++) { //去掉“;”,添加“{”
if(a[i]!=a[i+1]) break;else s=1;
}
n=a[0];
printf("After<%d>times,every child has<%d>candys.",m,n);

}

*/

#include
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{
child[i]=child[i]/2+temp/2;
temp=(child[i]-temp/2)*2;
if(child[i]%2==1)child[i]++;
}

for(i=0;iif(child[i]!=child[i+1])
{
tag=true;
break;
}
}

cout<<"经过"<<<"大家手中的糖的块数都是:"<
}

获奖程序一:
#include
#include
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
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<<"分糖次数:"<cout<<"每个小朋友手中的糖果数:"<}

for(i=0;i<10;i++);//可能导致错误,分号 会导致内存错误
{if((a[i]%2)!=0) a[i]=a[i]+1;

for(i=0;i<9;i++); //此处加了分号,无意义,导致只比较a[9]和a[10],出现内存错误
if(a[i]!=a[i+1]) break;else s=1;