约瑟夫问题 Posted on 2018-05-04 | In algorithm | 123456789101112131415161718192021222324252627282930313233343536373839#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 Donate WeChat Pay Alipay