约瑟夫问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#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);//归还 清除内存;
}
Donate comment here