圆环报数程序, 抛砖引玉
n个人围成一圈, 从第一个人从1开始报数。到m时, 第m个退出,m+1从1开始报。
#include "stdafx.h"#include <stdio.h>#include <stdlib.h>typedef struct NODE{ int iValue; NODE* prev; NODE* next; NODE() { iValue = 0; prev = NULL; next = NULL; }} *PNODE;PNODE initList(int n ){ PNODE p = new NODE; p->iValue = 1; PNODE ret = p; for(int i = 1; i< n; i++) { PNODE temp = new NODE; temp->iValue = i + 1; p->next = temp; temp->prev = p; p = temp; } p->next = ret; ret->prev = p; return ret;}void fun(PNODE p , int m){ if(p == NULL) return; if(p->next == p) { printf("%d\n", p->iValue); delete p; return ; } int t = m - 1; while(t--) { p = p->next; } p->prev->next = p->next; p->next->prev = p->prev; printf("%d\n", p->iValue); PNODE temp = p->next; delete p; fun(temp, m);}void main(){ int n = 15; PNODE p = initList(15); fun(p, 4);}//n可以达到 100亿,k不超过1000的版本,结果从0开始数的。int64 solve(int64 n, int64 k){ if (n == 1 || k == 1) return n - 1; if (n <= k) { int ans = 0; for (int i = 2; i <= n; ++i) ans = (ans + k) % i; return ans; } int64 leave = n / k; int64 tans = solve(n - leave, k); int64 tail = n - leave * k; if (tans < tail) return leave * k + tans; tans -= tail; int64 id = tans / (k - 1); int64 off = tans % (k - 1); return id * k + off;}