
{
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
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)