约瑟夫问题【1】
题目:n个人围成一圈,顺序排号,从第1个人(编号为0的人)从1开始报数,报到m(m<=n)的人出圈,然后下面未出圈的人接着从1开始报数,直到所有人都出圈。请按出圈顺序输出出圈的人的编号。
代码如下:
1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int i, k, m, n, num[50], *p; 6 cout << "input number of person: n="; 7 cin >> n; 8 p = num; 9 for (i = 0; i<n; i++) 10 *(p + i) = i + 1; // 以1至n为序给每个人编号 11 i = 0; // i为每次循环时计数变量 12 k = 0; // k为按1,2,3报数时的计数变量 13 m = 0; // m为退出人数 14 while (m<n - 1) // 当退出人数比n-1少时(即未退出人数大于1时)执行循环体 15 { 16 if (*(p + i) != 0) k++; 17 if (k == m) // 将退出的人的编号置为0 18 { 19 *(p + i) = 0; 20 k = 0; 21 m++; 22 } 23 i++; 24 if (i == n) i = 0; // 报数到尾后,i恢复为0 25 } 26 while (*p == 0) p++; 27 cout << "The last one is NO." << *p << endl; 28 return 0; 29 }
当n=10,m=3是,结果如下: