这个题目有人问过的,不过还是没弄明白。大虾们帮下忙,谢啦。
最好有注释还有思路啊。
有10个人围成一圈,顺序排号。从第一个人开始报数(从l到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
刚抄上,没运行~你看看吧~
#include<stdio.h>
#define N 50
int main()
{
int i,k,m,n,num[N],*p;
printf("Input number of person:n=");
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
*(p+i)=i+1;//以1至n为序为每个人编号
i=0;//i为每次循环时的计数变量
k=0;//k为按1、2、3报数时计数变量
m=0;//m为退出人数
while(m<n-1)//当退出的人数比n-1少时执行循环体
{
if(*(p+1)!=0)k++;
if(k==3)//对退出的人编号为设置为0
{
*(p+i)=0;
k=0;
m++;
}
i++;
if(i==n)i=0;//报数到尾后,i恢复到0
}
while(*p==0)p++;
printf("The last one is NO.%d\n",*p);
}
是出圈问题.蛮经典的.找找看应该蛮多的.
#include <stdio.h>
void main()
{
int i,m,k,*p,num[10];
p=num;
for (i=0;i<10;i++)
{
*(p+i)=i+1;//为10个人编号
}
i=0;
k=0;//计数1~3
m=0;//推出人数计数器
while (m<9)
{
if (*(p+i)!=0)
k++;
if (k==3)
{
*(p+i)=0;//设为0,表示退出
k=0;//重新计数
m++;
}
i++;
if (i==10)//从头报数
i=0;
}
while (*p==0)
{
p++;
}
printf("%d\n",*p);
}
这个参考下.
我再给个~这个问题是很经典的,也是有名字的,称做josephus问题~
#include<stdio.h>
#include<conio.h>
main()
{
int num=10; //假设有10个小孩
int interval; //报的数
int a[num],i;
char flag='y';
while(flag=='y')
{
for(i=0;i<num;i++) //给孩子编号
{
a[i]=i+1;
printf("%d ",a[i]);
}
printf("\nplease enter the interval : ");
scanf("%d",&interval);
int k=1,j; //k表示第几个小孩,当k==num时,表示结束
i=-1;
while(1)
{
for(j=0;j<interval;)
{
i=(i+1)%num;
if(a[i]!=0)
j++;
}
if(k==num) break;
printf("%d ",a[i]);
a[i]=0; //表示孩子已经离开
k++;
}
printf("\nthe last one is : %d" ,a[i]);
printf("\ncontinue? y/n\n\n");
flag=getch();
}
}
[此贴子已经被作者于2007-4-25 10:01:40编辑过]