Code Bye

求帮助有关Josephus问题!好久都没写出来

题目描述
n个人排成一圈,按顺时针方向依次编号1,2,3…n。从编号为1的人开始顺时针”一二”报数,报到2的人退出圈子。这样不断循环下去,圈子里的人将不断减少。最终一定会剩下一个人。试问最后剩下的人的编号。
输入
不超过1000组数据。
每组数据一行,每行一个正整数,代表人数n。 (1 <= n <= 1000)
输出
每组输入数据输出一行, 仅包含一个整数,代表最后剩下的人的编号。
用队列写,本人的代码是:
#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);
cal(n);
printf(“%d”,front());
return 0;

}
本人的想法是这样的:通过主函数调用函数功能,完成分函数后再将求出的编号返回至主函数并显示出来,可为什么用VC运行的时候输入n后,没有反应。

解决方案

20

你忘记调用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执行停在该断点处。)是程序员必须掌握的技能之一。

20

你这个程序貌似逻辑上还是有问题的,输入3应该输出的是3吧?,输入4结果也不对…..

10

仅供参考:
//假设有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();
}

10

有公式的,搜搜看。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求帮助有关Josephus问题!好久都没写出来