当前位置: 代码迷 >> C语言 >> [求助]有10个人围成一圈,顺序排号。从第一个人开始报数(从l到3报数),凡报 ...
  详细解决方案

[求助]有10个人围成一圈,顺序排号。从第一个人开始报数(从l到3报数),凡报 ...

热度:298   发布时间:2007-04-23 20:25:46.0
[求助]有10个人围成一圈,顺序排号。从第一个人开始报数(从l到3报数),凡报到3的人

这个题目有人问过的,不过还是没弄明白。大虾们帮下忙,谢啦。
最好有注释还有思路啊。

有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);
}


----------------解决方案--------------------------------------------------------
好像不对啊.~~ 
----------------解决方案--------------------------------------------------------
用循环链表
算发就是 for(i=0;i<9;i++) /*删除9个*/
for(j=0;j<3;j++)
{ if(j==2)
q->next=p->next; /*删除报3的人*/
}
大慨是这样拉 你自己去写哈
----------------解决方案--------------------------------------------------------
不会啊
----------------解决方案--------------------------------------------------------

是出圈问题.蛮经典的.找找看应该蛮多的.

#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编辑过]


----------------解决方案--------------------------------------------------------
  相关解决方案