C语言 报数游戏

C语言 报数游戏,第1张

main()

{

int a[22]

int i,j

for(i=0i<21i++)a[i]=1

a[0]=0//这样,a[]的下标就是编号

j=0

int f,s

int n

scanf("%d",&n)

for(i=1i++)

{

NA:

j++

if(j==22)j=1//j的值是1~21

if(a[j]==0)goto NA

if(i==n)

{

a[j]=0

printf("j=%d\n",j)

s=0

for(f=0f<22f++)

{

s+=a[f]

}

if(s==1)break

i=0

}

}

for(f=0f<22f++)

{

if(a[f]==1)

printf("%d\n",f)

}

}

方法一:(推荐)不受人数限制,因为采用的动态分配

#include <stdio.h>

#include <malloc.h>

/*********************************************************************

*以循环队列的数据结构实现

*时间复杂度T(n)

*采用循环队列数据结构,使得每次对数组的访问次数减少到最少

**********************************************************************/

int main(void)

{

//定义并初始化各种变量

int i=0,//控制变量

num=0,//人数

die=0,//报数值

front,//队头位置

rear,//队尾位置

temp=0//中间变量

do

{

printf("\n请输入人数(输入小于0退出):")

scanf("%d",&num)

printf("\n请输入报数值:")

scanf("%d",&die)

int *cycle=(int *)malloc((num+1)*sizeof(int))//多申请一个空间,在循环过程中方便处理

//依次编号,一号元素为0,暂时闲置

for(i=0i<=numi++)

{

cycle[i]=i

}

//置队头和队尾的位置

front=1

rear=num

i=1//报数器置1,开始报数

while(front!=rear)//当队列中元素不止一个时,循环

{

//备份出队数据

temp=(rear+1)%(num+1)//在位置rear后预留一个位置,以免有元素入队

cycle[temp]=cycle[front]

front=(front+1)%(num+1)//队头元素出队,队头位置加1

//如果出队的人报数符合条件

if(i==die)

{

i=1//报数重新置1,开始报数

printf("%d出队\n",cycle[temp])//显示出队的元素

}

//如果出队的人报数不符合条件

else

{

i++//报数值增1

//队尾插入刚出队的元素

rear=(rear+1)%(num+1)

cycle[rear]=cycle[temp]

}

}

printf("幸存者是%d\n",cycle[front])

free(cycle)

}while(num!=0)

return 0

}

方法二:(按你的要求)

#include <stdio.h>

/*********************************************************************

*以纯粹的思维方法实现

*时间复杂度T(n)

*过程繁琐,而且也不容易理解

*********************************************************************/

void main(void)

{

int result(int *p,int n,int m)

int i=0,m=0,n=0

int num[50]

int *p

for()

{

printf("输入人数和报数值:")

scanf("%d%d", &n, &m)

for(i = 0i <ni++)

num[i] = i + 1

p = num

cout<<"The last one is NO."<<result(p,n,m)<<endl

}

}

int result(int *p,int n,int m)

{

int i=0

for(i=0i<ni++)

p[i]=i+1

i=0 // i为每次循环时计数变量

int k=0 // k为按1,2,3...m报数时的计数变量

int die=0 // die为退出人数

while (die<n-1) // 当退出人数比n-1少时(即未退出人数大于1时)执行循环体

{

if (p[i]!=0) k++//如果编号为0,就不报数;如果编号不为0,报数加1

if (k==m) // 将退出的人的编号置为0

{

printf("%d退出\n",p[i])

p[i]=0

k=0//重新开始报数

m++//退出人数加1

}

i++

if (i==n) i=0 // 报数到尾后,i恢复为0

}

while(*p==0) p++

return *p

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11541725.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存