JL BLOG CS Lover

约瑟夫问题

2018-05-04
JiefanLee

阅读:


#include <stdio.h>  
#include <stdlib.h>  
int main(void)
{
	int i, n, x;
	printf("请输入参加报数的人数:");
	scanf("%d", &n);//利用数组与指针之间的关系改变地址,  

	printf("x:");
	scanf("%d", &x);
	int p[100];
	for (i = 0; i<n; i++)
		p[i] = i + 1;

	int k = 1;//k为报的数
	int m = 0;

	while (m<n-1)//注意这里是小于n-1而不是n,因为m=n-2的时候还要退出一个,就只剩一个了
		for (i = 0; i<n; i++)
		{
			if (*(p + i) != 0)//没有退出
			{
				if (k == x)
				{
					printf("退出编号为:%d\n", *(p + i));
					*(p + i) = 0;//将退出的人标记为0     
					m++;//退出人数加1   
					k = 0;
				}
				k++;
			}
		}
	for (i = 0; i<n; i++)//找出地址非0的那个指针即所找的那个编号  
		if (*(p + i) != 0)
			printf("\n最终剩余为:%d\n", i + 1);
	system("pause");
	return 0;
	free(p);//归还 清除内存;  
}

Similar Posts

上一篇 nQueens

Comments