C语言积木问题
幼儿园老师带领n个小朋友围成一圈做游戏,首先发给每个小朋友任意数量不等的积木,再给得到单数积木的小朋友1个积木凑成双数,然后开始一轮游戏,每个小朋友把自己的积木分一半给坐在左边的小朋友。往下给单数的小朋友加一个凑成双数后做下一轮,就这样一轮一轮做直到所有小朋友的积木数量都相同。编程模拟此过程,输出每一轮各个小朋友积木的数量。
追问:程序错误。。
幼儿园老师带领n个小朋友围成一圈做游戏,首先发给每个小朋友任意数量不等的积木,再给得到单数积木的小朋友1个积木凑成双数,然后开始一轮游戏,每个小朋友把自己的积木分一半给坐在左边的小朋友。往下给单数的小朋友加一个凑成双数后做下一轮,就这样一轮一轮做直到所有小朋友的积木数量都相同。编程模拟此过程,输出每一轮各个小朋友积木的数量。
追问:程序错误。。
答案:
#include <stdio.h>
#include <malloc.h>
static int count=0;
typedef struct person//结构体存放每个学生的积木数
{
int date;
struct person *next;
}LIST;
void add(LIST *head)//不是偶数的添加1个
{
LIST *p=head;
while(p!=NULL)
{
if((p->date)%2!=0)(p->date)+=1;
p=p->next;
}
}
void transfer(LIST *head)//每个学生的积木分一半给左边的
{
LIST *p=head;
int date=head->date;
head->date/=2;
while(p->next!=NULL)
{
p->next->date/=2;
p->date+=p->next->date;
p=p->next;
}
p->date+=date/2;
count++;
}
void out(LIST *head)//输出每个学生的积木数
{
LIST *p=head;
while(p!=NULL)
{
printf("%d\t",p->date);
p=p->next;
}
printf("\n");
}
int isover(LIST *head)//判断是否每个人的积木数相等
{
LIST *p=head;
while (p->next!=NULL)
{
if(p->date!=p->next->date)return 0;
p=p->next;
}
return 1;
}
void del(LIST *head)//释放内存
{
LIST *p=head;
LIST *q=head->next;
while(p!=NULL)
{
free(p);
p=q;
if(q!=NULL)q=q->next;
}
}
int main()
{
int n;
int i;
LIST* head=NULL;
LIST* q=NULL;
printf("输入游戏的人数:");
scanf("%d",&n);
for (i=0;i<n;i++)//发积木给学生
{
LIST *p=(LIST*)malloc(sizeof(LIST));
printf("给第%d个学生的积木数:",i+1);
scanf("%d",&p->date);
p->next=NULL;
if(i==0)
{
head=p;
}
else
{
q->next=p;
}
q=p;
}
while(1)//开始游戏
{
add(head);
out(head);
if(isover(head))break;
transfer(head);
for(i=0;i<100000000;i++);
}
del(head);
printf("游戏做了%d轮后结束!\n",count);
return 0;
}=====================
感觉用链表最好通过、但没有必要使用链表,既不需要插入删除等操作!
#include<stdio.h>
#include<stdlib.h>
int *gblocks(int number,int *blocks,int r_number)
{
int i,blocks_a,blocks_b;
if(NULL==blocks)
{
blocks=(int *)malloc(sizeof(int)*number);
for(i=0;i<number;i++)
*(blocks+i)=random(9)+1;
}
while(r_number)
{
for(i=0;i<number;i++)
{
if(*(blocks+i)%2)
(*(blocks+i))+=1;
}
blocks_a=0;
for(i=0;i<number;i++)
{
blocks_b=*(blocks+i)/=2;
*(blocks+i)+=blocks_a;
blocks_a=blocks_b;
}
*blocks+=blocks_a;
r_number--;
}
return blocks;
}
void main()
{
int *blocks=NULL,i;
blocks=gblocks(10,blocks,1);
for(i=0;i<10;i++)
printf("%3d|",*(blocks+i));
printf("\n");
free(blocks);
getch();
}void gameLoop(int *initNumber, int n)
{
int i=0;
bool bNotEqual = false;
int prevItem = 0;
while( 1 )
{
int temp = initNumber[0];
bNotEqual = false;
initNumber[0] = initNumber[n-1]/2 + initNumber[0]/2;
if( initNumber[0]%2 )
initNumber[0] ++;
for( i=n, prevItem = 0; i>0; i-- )
{
initNumber[i] = initNumber[i]/2 + initNumber[i-1]/2;
if( initNumber[i]%2 )
initNumber[i]++;
if( initNumber[i]!=initNumber[prevItem] )
bNotEqual = true;
prevItem = i;
}
if( !bNotEqual )
break;
}
for( i=0; i<n; i++ )
printf( "Number %d: %d\n", i+1, initNumber[i] );
}