约瑟夫问题/报数问题
#include<stdio.h> int main(){ int a[100]={0}; int n,m,l=0,i,j,s=0; scanf(%d %d,&n,&m); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ ++s; if(s>n) s=1;//s从头开始数 if(a[s]) j--;//如果遇到淘汰的不计数 } printf(%d ,s); a[s]=1; } return 0; } //约瑟夫问题 依次输出淘汰的序号
#include <stdio.h> #define MAXN 20 void CountOff( int n, int m, int out[] ); int main() { int out[MAXN], n, m; int i; scanf(%d %d, &n, &m); CountOff( n, m, out ); for ( i = 0; i < n; i++ ) printf(%d , out[i]); printf(\n); return 0; } void CountOff(int n, int m, int out[]) { int a[MAXN], count = 1, index = 1; for (int i = 0; i < n; i++) a[i] = i + 1; while (count <= n) for (int i = 0; i < n; i++) { if (a[i] != 0) if (index % m == 0) { out[i] = count++; a[i] = 0; index = 1; } else index++; } } 按编号输出淘汰的先后