约瑟夫环问题是一个很经典的问题:一个圈共有N个人(N为不确定的数字),第一个人的编号为0或者1(两个都可以,看你的程序如何编写),假设这边我将第一个人的编号设置为1号,那么第二个人的编号就为2号,第三个人的编号就为3号,第N个人的编号就为N号,现在提供一个数字M,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到M这个数字的人出局,紧接着从出局的这个人的下一个人重新开始从1报数,和上面过程类似,报到M的人出局,直到N个人全部出局,请问,这个出局的顺序是什么?
我们可采用两个方式解决,也就是题目的两种
1.数组实现
/*
有n个人围城一圈,按顺序编号,从第一个人开始报数,从1报到m,凡报到m的人退出圈子,
然后接着报数,问最后留下来的是原来的第几号的那位?
*/
//数组
//用长度为n的数组存储人的编号,退出的人编号置为0,当n-1个人都退出后,剩下的那个编号不为0的人就是要找的人。
#include <stdio.h>
#include <malloc.h>
void left_num(int* a,int n,int m) {
int out = 0,count = 0,i = 0; //out为出去的人数,count为报数,i为目前报到第几个人
int *p = a;
int num = 0;
for(num = 0;num < n;num++) {
*(a+num) = num+1;
} //为n个人编