解题思路:
先对照代码过一遍思路:
首先定义一个数组队列:
第一步,定义一个数组,大小尽量大(后面会解释),初始化为0(习惯)。
第二步,给前n个元素编号为1,2,3……相当于给n个玩家编号。
第三步,定义两个指针front和rear,front=0表示front指向队首,rear=n-1表示rear指向队尾。
此时数组队列已定义完毕。
那我们要怎么模拟数到3的人退出队列呢?
很简单,只要在遍历队列时每遍历两个就跳过一个即可。
那我们怎样保留数1和数2的玩家呢?
也很简单,比如front=0的人编号为1,我们把他放到队尾,同时记得移动队尾和队首,即a[++rear]=a[front++];
最后执行循环到队列只剩下一个元素就能得出答案了。
注意事项:
使用顺序队列要求数组大小足够大,如果想占用尽可能小的空间实现队列功能可以构造循环队列,即rear指向数组的最后一个内存空间时,rear-=len-1;
参考代码:
#include<stdio.h>
int main(){
int a[1000]; //尽量大
int front,rear,n;
scanf("%d",&n);
rear=n-1;front=0;
int i=0;
for(i=0;i<n;i++)
a[i]=i+1; //定义队列
while(rear>front){
a[++rear]=a[front++];
a[++rear]=a[front++];
front++;
} //循环结束时rear=front,表示该队列此时只有一个元素
printf("%d",a[rear]);
}
0.0分
2 人评分
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:725 |
简单的a+b (C语言代码)浏览:646 |
剔除相关数 (C语言代码)浏览:1013 |
A+B for Input-Output Practice (VII) (C++代码)浏览:613 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:753 |
兰顿蚂蚁 (C++代码)浏览:1044 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1156 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:508 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:689 |
演讲大赛评分 (C语言代码)浏览:1631 |