代码借鉴CSDN大佬https://blog.csdn.net/weixin_41409140/article/details/88071047(对大佬的大佬代码进行分析)
18063 圈中的游戏
时间限制:1000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC
Description
有n个人围成一圈,从第1个人开始报数1、2、3,每报到3的人退出圈子。编程使用链表找出最后留下的人。
输入格式
输入一个数n,1000000>=n>0
输出格式
输出最后留下的人的编号
输入样例
3
输出样例
2
----------------------------------------------------------
思路:
/*#include <stdio.h>
#include<stdlib.h>
int c[1000000];
int main()
{ //注意了cur和pre是类似于指针,是一种咱们的“数组指针”,指向的是下标
int i,j,n,pre,cur; //pre为搞死的那个的前一个的下标,cur为搞死那个的下标
scanf("%d",&n);
if(n==1)printf("1\n"); //只有一个人都数不了(不可以自己和自己数哦)(毕竟最后是一定要留一个人的就直接输出1就好(但是输入的如果是2的话,
是可以数的了,所以就是1死,二活,所以只有输入1的时候是一个特例,不要认为输入2的时候不够三个人就也是特例了
else
{
for(i=0;i<n-1;i++) c[i]=i+1; //这里外部循环的边界可以是n也可以是n-1,甚至循环2n也是可以的,因为最后一个无论循环多少次都会存在的,就好像就只有一个人一样,是不可以自己和自己数的,所以就输出1 但是如果边界比较小的话就不能保证都筛选完了,所以最好还是n-1以上的(因为一次外部里面就有三次小的循环,每次内部循 环就搞死一个,所以要留一个,也就意味着要搞死n-1个,
所以就要n-1次外部循环才行的,所以外部循环可以是n-1次及以上的
c[n-1]=0; //就是为了方便循环(毕竟也是一个圈,最后一项一般都不是本身,一般都是为了配合圈的操作来定一个比较牛的值,来方便后续的圈操作的
cur=n-1;
for(i=0;i<n-1;i++)
{
for(j=0;j<3;j++)
{
pre=cur; //这个个循环里面其实pre就是记录之后cur指向的下标的的前一个下标的
cur=c[cur]; //核心
}
c[pre]=c[cur]; //cur的数值给了pre的数值
}
printf("%d",pre+1); //由于初始化的时候是把第一项是2,第二项是3,所以要想得到最后的数值的话
//因为我们得到的是下标pre所以就要+1才是它的数值了
}
return 0;
}
*/
无注释代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 int c[1000000]; 4 int main() 5 { 6 int i,j,n,pre,cur; 7 scanf("%d",&n); 8 if(n==1) 9 printf("1\n"); 10 else 11 { 12 for(i=0;i<n-1;i++) 13 c[i]=i+1; 14 c[n-1]=0; 15 cur=n-1; 16 for(i=0;i<n-1;i++) 17 { 18 for(j=0;j<3;j++) 19 { 20 pre=cur; 21 cur=c[cur]; 22 } 23 c[pre]=c[cur]; 24 } 25 printf("%d",pre+1); 26 } 27 return 0; 28 }