小弟以前有看过,
#include <stdio.h>
#include <conio.h>
#define MAX 200 /*数组长度上限*/
main()
{
int x[MAX],i,j,n,k; /*n为报数的总人数,k为报几号出去的那个数。按题意n=10,k=3*/
int start,temp,save_n; /*start为这一次开始报数的那个人的序号,save_n为总人数n的一个备份*/
clrscr();
/*输入n和k*/
printf("n=");
scanf("%d",&n);
if (n>=MAX)
{
printf("n(%d)\>MAX(%d)\n",n,MAX);
printf("Press any key to exit");
getch();
return;
}
printf("k=");
scanf("%d",&k);
for (i=0;i<n;i++)
x[i]=i+1;
save_n=n; /*备份总人数*/
for (start=1;n>1;) /*主要思想是,当报到k的那个人的序号复制到temp变量。同时,这个序号以后和n以前的数据前移1位置,再将这个temp序号放在数组的n-1。同时n减1。*/
{
start=start+k-1;
start%=n;
if (start==0)
{
start=1;
n--;
continue;
}
temp=x[start-1];
for (j=start;j<=n-1;j++)
x[j-1]=x[j];
x[n-1]=temp;
n--;
}
/*数组的后面开始输出出队的序号*/
for (i=save_n-1;i>=0;i--)
{
printf("%d",x[i]);
if (i!=0)
putch(',');
}
getch();
return 0;
}
#include <stdio.h>
#include <conio.h>
#define MAX 200 /*数组长度上限*/
main()
{
int x[MAX],i,j,n,k; /*n为报数的总人数,k为报几号出去的那个数。按题意n=10,k=3*/
int start,temp,save_n; /*start为这一次开始报数的那个人的序号,save_n为总人数n的一个备份*/
clrscr();
/*输入n和k*/
printf("n=");
scanf("%d",&n);
if (n>=MAX)
{
printf("n(%d)\>MAX(%d)\n",n,MAX);
printf("Press any key to exit");
getch();
return;
}
printf("k=");
scanf("%d",&k);
for (i=0;i<n;i++)
x[i]=i+1;
save_n=n; /*备份总人数*/
for (start=1;n>1;) /*主要思想是,当报到k的那个人的序号复制到temp变量。同时,这个序号以后和n以前的数据前移1位置,再将这个temp序号放在数组的n-1。同时n减1。*/
{
start=start+k-1;
start%=n;
if (start==0)
{
start=1;
n--;
continue;
}
temp=x[start-1];
for (j=start;j<=n-1;j++)
x[j-1]=x[j];
x[n-1]=temp;
n--;
}
/*数组的后面开始输出出队的序号*/
for (i=save_n-1;i>=0;i--)
{
printf("%d",x[i]);
if (i!=0)
putch(',');
}
getch();
return 0;
}