/*圆桌问题
编号为1——n的n个人围坐在圆桌前,从某个人开始报数,以1开始,报数为常数m的人离开桌子。
下个人接着从1开始报数,依次重复进行下去,直到全部人都离开桌子。
要求输出各位离开的编号次序。
*/
The most recent one on 2.May.2008, Does it make sense?
=================
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 10
#define ANNOUNCER 4
int main(int argc, char **argv){
int array[LENGTH];
int len = LENGTH;
int i, j, left;
for(i = 0; i< LENGTH; i++){//marks the position that is available
array[i] = 1;
}
j = 0;
for(i = 0; i< LENGTH; i = (i+1)%10){//loop until len == 1
if(array[i] != 0){
j++;//counter
}
if(j==ANNOUNCER){//reached 4, out
array[i] = 0;//unmark
len--;
j = 0;
}
if(len == 1){
break;
}
}
for(i = 0;i<10; i++){
if(array[i] != 0){
printf("left: %d/n",i);
}
}
}
the original post
===============
#include<stdio.h>
void main()
{
int r[11]={1,2,3,4,5,6,7,8,9,10,11};/*11个人*/
int i;
int n=0; /*循环计数*/
int m=0; /*统计出局人数*/
int final; /*记录最后一个不为0的数的下标,即为最后剩下人的标号*/
int final_pre;
bs:;
for(i=0;i<11;i++)
if(r[i]!=0)
{
n++;
final=i;
if(n==4)/*报数到4的出局*/
{ r[i]=0;
n=0;
m++;
final=final_pre;
}
final_pre=final;
}
if(m!=10)
goto bs;
printf("%d/n",r[final]);/*the only man in the world:*/
getchar();
}
/*
感言:以前也作过这个题。
以前的代码:
#include
void main()
{ static int a[9]={1,1,1,1,1,1,1,1,2};
int i,m,n;
n=0;
m=0;
bs:;
for(i=0;i<9;i++)
if(a[i]==1)
{if(n==4)
{ n=0;/*报数*/
a[i]=0;
}
else
n++;
}
else
{ if(a[i]==0)
{m++; /*统计出局的人数*/
a[i]=66;/*避免重复计数*/
}
if(a[i]==2)
{if(m==7)/*只剩下一个人了*/
break;
else
goto bs;
}
}
for(i=0;i<9;i++)
if(a[i]==1)
printf("%d/n",i);
}
这次的控制语句做的好些。并且用了final,final_pre。就不用去循环检查了。这样看这爽。虽然效率不一定提高能够
*/
编号为1——n的n个人围坐在圆桌前,从某个人开始报数,以1开始,报数为常数m的人离开桌子。
下个人接着从1开始报数,依次重复进行下去,直到全部人都离开桌子。
要求输出各位离开的编号次序。
*/
The most recent one on 2.May.2008, Does it make sense?
=================
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 10
#define ANNOUNCER 4
int main(int argc, char **argv){
int array[LENGTH];
int len = LENGTH;
int i, j, left;
for(i = 0; i< LENGTH; i++){//marks the position that is available
array[i] = 1;
}
j = 0;
for(i = 0; i< LENGTH; i = (i+1)%10){//loop until len == 1
if(array[i] != 0){
j++;//counter
}
if(j==ANNOUNCER){//reached 4, out
array[i] = 0;//unmark
len--;
j = 0;
}
if(len == 1){
break;
}
}
for(i = 0;i<10; i++){
if(array[i] != 0){
printf("left: %d/n",i);
}
}
}
the original post
===============
#include<stdio.h>
void main()
{
int r[11]={1,2,3,4,5,6,7,8,9,10,11};/*11个人*/
int i;
int n=0; /*循环计数*/
int m=0; /*统计出局人数*/
int final; /*记录最后一个不为0的数的下标,即为最后剩下人的标号*/
int final_pre;
bs:;
for(i=0;i<11;i++)
if(r[i]!=0)
{
n++;
final=i;
if(n==4)/*报数到4的出局*/
{ r[i]=0;
n=0;
m++;
final=final_pre;
}
final_pre=final;
}
if(m!=10)
goto bs;
printf("%d/n",r[final]);/*the only man in the world:*/
getchar();
}
/*
感言:以前也作过这个题。
以前的代码:
#include
void main()
{ static int a[9]={1,1,1,1,1,1,1,1,2};
int i,m,n;
n=0;
m=0;
bs:;
for(i=0;i<9;i++)
if(a[i]==1)
{if(n==4)
{ n=0;/*报数*/
a[i]=0;
}
else
n++;
}
else
{ if(a[i]==0)
{m++; /*统计出局的人数*/
a[i]=66;/*避免重复计数*/
}
if(a[i]==2)
{if(m==7)/*只剩下一个人了*/
break;
else
goto bs;
}
}
for(i=0;i<9;i++)
if(a[i]==1)
printf("%d/n",i);
}
这次的控制语句做的好些。并且用了final,final_pre。就不用去循环检查了。这样看这爽。虽然效率不一定提高能够
*/