题目描述 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入
初始人数 n
输出最后一人的初始编号
样例输入
3
样例输出
2
分析
约瑟夫夫环问题,先给数组赋值,然后把该出列(count为3,并且元素不为0)的赋值为0,如果到最后的话,就再从0开始。最后还剩一个的时候,把该元素输出。
AC代码
#include<stdio.h>
void left_num(int* a,int n) {
int count = 0;
int i;
int out = 0;
for(i = 0;i < n;i++) {
a[i] = i + 1;
}
i = 0;
while(out < n - 1) {
if(a[i] != 0) {
count++;
}
if(count == 3) {
count = 0;
a[i] = 0;
out++;
}
i++;
if (i == n) {
i = 0;
}
}
for(i = 0;i < n;i++) {
if (a[i] != 0) {
printf("%d\n",a[i]);
}
}
}
int main(void) {
int a[101];
int n;
scanf("%d",&n);
left_num(a,n);
return 0;
}
扩展
自己确定出列的序号(就是加一个参数然后稍微改动一下)
void left_num(int* a,int n,int m) {
int count = 0;
int i;
int out = 0;
for(i = 0;i < n;i++) {
a[i] = i + 1;
}
i = 0;
while(out < n - 1) {
if(a[i] != 0) {
count++;
}
if(count == m) {
count = 0;
a[i] = 0;
out++;
}
i++;
if (i == n) {
i = 0;
}
}
for(i = 0;i < n;i++) {
if (a[i] != 0) {
printf("%d\n",a[i]);
}
}
}