user-0 提问: 新手求助有关Josephus问题！！！好久都没写出来

回复:
user: user-1
content: 有公式的，搜搜看。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:有公式的，搜搜看。已通过，谢谢老师

user: user-1
content: 仅供参考：//假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }

user: user-2
content: 你这个程序貌似逻辑上还是有问题的，输入3应该输出的是3吧？，输入4结果也不对.....

user: user-0
content: 引用 1楼小灸舞 的回复:你忘记调用create_array_queue给arr和count初始化了  #include <stdio.h> #include <malloc.h> static int *arr=NULL; static int count; int create_array_queue(int sz)  { 	arr = (int *)malloc(sz*sizeof(int)); 	if (!arr)  	{ 		printf("arr malloc error!"); 		return -1; 	} 	count = 0;  	return 0; }  int destroy_array_queue()  { 	if (arr)  	{ 		free(arr); 		arr = NULL; 	}  	return 0; } void add(int val)  { 	arr[count++] = val; } int front()  { 	return arr[0]; } int pop()  { 	int i = 0; 	int ret = arr[0];  	count--; 	while (i++<count) 		arr[i-1] = arr[i];  	return ret; } int size()  { 	return count; } int is_empty() { 	return count==0; } int cal( int n) { 	int i,count,a; 	for(i=1;i<=n;i++) 		add(i); 	count=0; 	while(size()>1) 	{ 		count=count+1; 		if(count%2==0) 			pop(); 		else 			a=front(); 		pop(); 		add(a);	 	} 	return front(); } int main(void)  { 	int n; 	scanf("%d",&n); 	create_array_queue(n); 	cal(n);	   	printf("%d",front()); 	return 0;  }  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。谢谢版主大大，不过我提交oj时显示时间超限，请问我可以在哪个地方进行优化？麻烦了

user: user-2
content: 你忘记调用create_array_queue给arr和count初始化了  #include <stdio.h> #include <malloc.h> static int *arr=NULL; static int count; int create_array_queue(int sz)  { 	arr = (int *)malloc(sz*sizeof(int)); 	if (!arr)  	{ 		printf("arr malloc error!"); 		return -1; 	} 	count = 0;  	return 0; }  int destroy_array_queue()  { 	if (arr)  	{ 		free(arr); 		arr = NULL; 	}  	return 0; } void add(int val)  { 	arr[count++] = val; } int front()  { 	return arr[0]; } int pop()  { 	int i = 0; 	int ret = arr[0];  	count--; 	while (i++<count) 		arr[i-1] = arr[i];  	return ret; } int size()  { 	return count; } int is_empty() { 	return count==0; } int cal( int n) { 	int i,count,a; 	for(i=1;i<=n;i++) 		add(i); 	count=0; 	while(size()>1) 	{ 		count=count+1; 		if(count%2==0) 			pop(); 		else 			a=front(); 		pop(); 		add(a);	 	} 	return front(); } int main(void)  { 	int n; 	scanf("%d",&n); 	create_array_queue(n); 	cal(n);	   	printf("%d",front()); 	return 0;  }  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 引用 3 楼 qq423399099 的回复:你这个程序貌似逻辑上还是有问题的，输入3应该输出的是3吧？，输入4结果也不对..... int cal( int n) {     int i,count,a;     for(i=1;i<=n;i++)//以3为例子，n=3         add(i);     count=0;     while(size()>1)     {         count=count+1//count=1,执行else，a=1，删除1，并将1置于队尾，队列为 2 3 1；			                 if(count%2==0)//count=2，执行if，删除2，队列为 3 1；             pop();//count=3，执行else，a=3，删除3，并将3置于队尾，队列为 1 3；         else//count=4，执行if，删除1，队列为3，跳出循环             a=front();             pop();             add(a);        }     return front(); } 你看看我的注释，我以3为例子进行了分析，为什么算出来的结果是3而vc运行的话却是1？还有我感觉这样的算法是不是太慢了，需要运行多次导致时间超限的结果？