当前位置:编程学习 > C/C++ >>

C语言积木问题

幼儿园老师带领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] );
}

上一个:C语言编程问题
下一个:c语言算术语句

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,