问题描述:
有n个人围成一个环,然后给从某个人开始顺时针从1开始报数,每报到m时,将此人出环杀死(当然不杀死也可以啊),然后从下一个人继续从I报数,直到最后只剩下一一个人,求这个唯-剩下的存活的人是谁?
思路讲解:
我们可以用数组中的a[0]位置表示我们要移除(杀)的对象通过移动数组几次代表报m次数,当在a[0】位置的就是我们要删除的对象这里用movedel函数来表示这个操作,然后就是递归一次次人数减少情况向下递归。
#include<stdio.h>
int move_del(int a[], int size, int step); //移动数组 移动到a[0]> 的是被杀对象
int kill(int a[], int size, int step); //开始杀
//递归实现
int kill(int a[], int size, int step)
{
if (size == 1) {
printf("%d", a[0]);
return;
}
move_del(a, size, step);
kill(a, size - 1, step);
}
//移动数组函数删除0位
int move_del(int a[], int size, int step)
{
int i, j;
int t;
int m = size - 1;
//作移动
while (step) {
t = a[0];
for (j = 0; j < m; j++) {
a[j] = a[j + 1];
}
a[size - 1] = t;
step--;
}
printf("%d", t);
}
int main(void)
{
//接收数组
int a[100] = { };
int size;
int i;
printf("please input how many people?: ");
scanf("%d", &size);
//把a[m]当成被杀人的位置
for (i = 0; i < size; i++)
a[i] = i + 1;
kill(a, size, 3);
return 0;
}
运行结果: