有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到3的人退出圈子,下一个人从1开始重新报数,报到3的人退出圈子,如此下去,直到留下最后一个人。问留下来的人的编号。试编写相应程序。
第一种方法,指针,用到动态内存的分配,好处是报数的人数不限制,想报多少就分配多少内存。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int number=1;
int cnt=0;
int n;
scanf("%d",&n);
int *p=(int *)calloc(n,sizeof(int));
while(cnt<n-1)
{
for(int i=0;i<n;i++)
{
if(*(p+i)!=-1)
{
if(number==3)
{
cnt++;
number=0;
*(p+i)=-1;
}
number++;
}
}
}
for(int i=0;i<n;i++)
if(*(p+i)!=-1)
printf("Last Number is %d",i+1);
free(p);
return 0;
}
第二种方法用数组,缺点自然就是人数受数组大小限制,不灵活。
#include <stdio.h>
int main()
{
int a[51]={0};
int number=1;
int cnt=0;
int n;
scanf("%d",&n);
while(cnt<n-1)
{
for(int i=0;i<n;i++)
{
if(a[i]!=-1)
{
if(number==3)
{
cnt++;
a[i]=-1;
number=0;
}
number++;
}
}
}
for(int i=0;i<n;i++)
if(a[i]!=-1)
printf("Last Number is %d",i+1);
return 0;
}