您现在的位置是:主页 > news > 厦门35网站建设公司/百度推广关键词怎么设置好
厦门35网站建设公司/百度推广关键词怎么设置好
admin2025/5/6 22:09:37【news】
简介厦门35网站建设公司,百度推广关键词怎么设置好,广州定制型网站建设,义乌做网站一、需求 报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一…
厦门35网站建设公司,百度推广关键词怎么设置好,广州定制型网站建设,义乌做网站一、需求
报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一…
一、需求
- 报数游戏是这样的:有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(<n)的人退出圈子;下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。
- 本题要求编写函数,给出每个人的退出顺序编号。
- 函数接口定义如下
void CountOff( int n, int m, int out[] );
- 其中
n
是初始人数;m
是游戏规定的退出位次(保证为小于n的正整数)。 - 函数
CountOff
将每个人的退出顺序编号存在数组out[]
中。 - 因为C语言数组下标是从0开始的,所以第
i
个位置上的人是第out[i-1]
个退出的。
二、裁判程序样例
#include <stdio.h>
#define MAXN 20void CountOff( int n, int m, int out[] );int main()
{int out[MAXN], n, m;int i;scanf("%d %d", &n, &m);CountOff( n, m, out ); for ( i = 0; i < n; i++ )printf("%d ", out[i]);printf("\n");return 0;
}/* 你的代码将被嵌在这里 */
三、测试样例
- 输入样例
11 3
- 输出样例
4 10 1 7 5 2 11 9 3 6 8
四、思路分析
思路1
- 新建一个数组s,其大小与out相同,初始化值为1~n,这个数组的作用是记录1~n各个位置上人的状态,假设1号退出了,那么它的状态s[1] = 0;
- 定义一个people_number表示圈里还剩的人数,初始化值为n,每次退出一个人,people_number--,直到people_number为0;
- 每次循环都要对s数组进行遍历,判断当前的人是否退出了,如果没有退出,那就开始报数,定义count来累计报数,初始化为0;
- 报了数之后接着判断是否与m相同,相同的话:
假设当前位置为i,那么s[i] = 0表示当前位置的人退出了,out[i] = quit_order(quit_order从1开始,表示退出次序),
然后人数people_number要减1,count重新开始计数,退出的次序加1。
代码是这样的:
void CountOff( int n, int m, int out[] )
{int people_number = n;int i;int s[MAXN];int count = 0;int quit_order = 1;for(int i = 0; i < n; i++) {s[i] = i + 1;}while(people_number) {for(int i = 0; i < n; i++) {if(s[i] != 0) {count++;if(count == m) {s[i] = 0;people_number--;out[i] = quit_order;quit_order++;count = 0;}}}}
}
思路2(超时问题不懂)
- 1.将out数组中的元素全部初始化为0,目的是为了记录当前位置的退出次序,假设第1个人的退出次序为5(第5个退出的),那么out[0] = 5;
- 使用循环,当圈里没有人时退出循环,若当前位置的人没有退出,那么就报数(定义count,初始化为0)count++;
- 报完数后接着判断是否等于m,相同的话:
假设当前位置的人为i,那么它就要退出,它的退出次序为quit_order(quit_order初始化为0),即quit_order++,out[i-1] = quit_order(关于为什么是i-1,是因为第1个报数后,i就是1,如果他要退出,很明显是设置out[0]),然后count清零; - 实现当前位置的循环滚动,即i = i % n。
代码是这样的:
void CountOff( int n, int m, int out[] )
{int i;int people_number = n;int count =0;int quit_order = 1;for(i = 0; i < n; i++) {out[i] = 0;}i = 0;while(people_number) {if(out[i++] == 0) {//i++; //若写i++,就会超时,真的奇怪啊。count++;}if(count == m) {out[i - 1] = quit_order;quit_order++;people_number--;count = 0;}i = i % n;//每一次循环i都会增大,保证i<n}
}