一圈人报数问题问题该怎么解决~

到百度贴吧首页
新闻   网页   贴吧   知道   MP3   图片   视频   百科
    吧内搜索 | 帮助

一圈人报数问题问题该怎么解决~

222.53.124.*

1楼

有n个人围成一圈,从第一个人报数(从1报到3),凡报到3的人退出圈子,问最后留下的是原来的几号~~~??
以前会编的,现在忘了,有人向我请教 答不出来  郁闷~~~

159.226.67.*

2楼

链表实现,
被选中的就DELETE,
剩下的就是结果了.

3楼

#include <stdio.h>
#include <stdlib.h>

typedef struct _link
{
 struct _link * next;
 int pos;
}link;

int main(int argc, char *argv[])
{
 link *front, *p, *last;
 p=front=(link *)malloc(sizeof(link));/*先分配一个*/
 p->pos=1;
 int n=5, i=0, num=3;
 for(i=2;i<=n;i++)/*再分配其它的,总共n个*/
 {
 p->next=(link *)malloc(sizeof(link));
 p=p->next;
 p->pos=i;
 }
 p->next=front;/*使之围成一个圈*/
 i=0;/*从头开始数*/
 last=p=front;/*从头开始数*/
 while(p->next!=p)/*当p->next==p时就只剩一个了*/
 {
 i++;/*数数*/
 if(i==3)/*数到3了,此人该下去*/
 {
 last->next=p->next;
 free(p);
 p=last;
 i=0;
 }
 last=p;//last的作用是保存前一个link,如果是双向链表,就不需要它了
 p=p->next;//到下一个人
 }
 printf("%d",p->pos);//最后剩下的一个人的位置
 system("PAUSE");
 return 0;
}

4楼

不是吧,这是CFAN的题目,很老了啊!!!

5楼

闲着无事,
自己写写玩啊.呵呵.

202.116.24.*

6楼

#include <stdio.h>
struct date
{
int num;
struct date * next;
};

int main()
{
int i=0,n=1,m;
struct date *p1,*p2,*head;
scanf("%d",m);
p1=p2=head=(struct *)malloc(sizeof(struct date));
p1->num=n;
while(n<m)
{
n++;
p2->next=p1;p2=p1;
p1=(struct *)malloc(sizeof(struct date));
p1->num=n;
}
p2->next=head;

p1=head;
while(p1->next!=NULL)
{
i++;
p2=p1->next;
if (i%3==0)
p1->next=p2->next;
p1=p1->next;
}

printf("%d",p1->num);
getch();
}

202.107.209.*

7楼

顺着的我会,我想知道逆着报数要怎么做呀。救命,快来帮帮我!感激不尽!
有n个猴子围成一圈,从第一个人报数(从1报到3),凡报到3的人退出圈子,但要求是逆时打印出来的。

219.136.108.*

8楼

用数组来做是不是,只要把指针数转换成数组就行了???因为我不明白最后怎么样去确定它就是剩下最后的一个人了呢??? 可以给出明确运行结果吗?? 我在此谢过各位大侠了.这道题很重要的!!^_^ Help???

9楼

/*N个人围成一圈,从1抱到M.*/
#include <stdio.h>
int main()
{
int N,M,*a;
int i,j,position=1,total=0,chage;/*total出队的人数*/
printf("Enter the N and M\n");
scanf("%d%d",&N,&M);
a=(int *)malloc(N*sizeof(int));
for (i=0;i<N;i++)
a[i]=i+1;
while(1)
{
position+=M-1;
while (position>N-total)
position=position-N+total;
chage=a[position-1];
for (j=position;j<N-total;j++)
a[j-1]=a[j];
a[N-total-1]=chage;
total++;
if (total==N)/*出队人数等于N,程序结束*/
{
for (i=0;i<N-1;i++)
printf("%d->",a[N-i-1]);
printf("%d\n",a[0]);
return 0;
}
}
}

10楼

#include <stdio.h>
#include <stdlib.h>
typedef struct _Node
{
 int num;
 struct _Node* next;
}Node;
int main()
{
 int i,j;
 int number,count;
 Node* first,*cur,*pre;
 
 printf("Please input the total number,and the count.\n") ;
 scanf("%d,%d",&number,&count);

 for(i=1;i<=number;i++)
 {
 if(i==1)
 {
 first=(Node*)malloc(sizeof(Node));
 first->num=1;
 first->next=NULL;
 cur=first;
 }
 else
 {
 pre=cur; 
 cur=(Node*)malloc(sizeof(Node));
 cur->num=i;
 cur->next=NULL;
 pre->next=cur;
 }
 }
 cur->next=first;
 cur=first;
 do
 {
 printf("%d,",cur->num);
 cur=cur->next;
 }while(cur!=first);
 printf("\n");
 cur=first;
 pre=first;
 i=1;
 j=1;
 while(j<=number-1&&cur->next!=cur)
 {
 if(i==count)
 {
 i=1;
 j++;
 printf("%d,",cur->num);
 pre->next=cur->next;
 cur=pre->next;
 }
 else
 {
 i++;
 pre=cur;
 cur=cur->next;
 }
 }

 printf("\n%d",cur->num);
 
 getch();
 return 0;
}

11楼

#define N 7/*输入人数N*/
main()
{
int a[N],i,j=0,k=0;
for(i=0;i<N;i++)
a[i]=i+1;
while(j<N-1)
{ for(i=0;i<N;i++)
 {
 if(a[i]!=0) {k++;}
 if(k==3) {a[i]=0;j++;k=0;}
 }
 }
for(i=0;i<N;i++)
if(a[i]!=0) {printf("%d\n",a[i]);}
}

12楼

请问大家用什么软件运行C语言程序???
61.185.217.*

13楼

tc,或者vc
222.241.143.*

14楼

有哪位大哥能用数组搞定它 
 有急用!!!

219.224.57.*

15楼

用C++解决的:
#include<iostream>
using namespace std;
int main()
{
int d,n;
int t=0,s=0,k=0;
int j=1;
 cin>>n>>d;
 int *a=new int [n];
for(int i=0;i<n;i++)a[i]=i+1;
 for(i=0;i<n;i++)s+=a[i];
for(i=0;i<n;i++)
{
t=s;
s=0;
if(j==d && a[i]!=0){a[i]=0;j=1;}
if(a[i]!=0)j++;
if(i==n-1)i=-1;
for(k=0;k<n;k++)s+=a[k];
if(s==0)break;
}
cout<<"last:"<<t<<endl;
delete a;
return 0;
}

219.144.140.*

16楼

:"M个人围成一圈,从第一个人开始报数,数到N的人出圈.再由下一个人开始报数,数到N的人出圈.打印一次出圈的人.

17楼

这些算法是怎么推出来的哦,我只能看懂第一个啊。

18楼

用数组的大哥,是怎么想出来的啊??? 太奇怪了

19楼

数组可以啊
仍在队列的设为1,不在的设为0,然后按要求模拟就可以了……

124.114.28.*

20楼

#define N 13 
struct person 
{
 int number; 
 int nextop; 
}link[N+1]; 
main() 
{
 int I,count,h; 
 for(I=1;I<=N;I++) 
 {
 if(I==N) 
 link[i].nextp=1; 
 else 
 link[i].nextp=I+1; 
 link[i].number=I; 
 } 
 printf(“\n”); 
 count=0; 
 h=N; 
 printf(“sequence that person2 leave the circle:\n”); 
 while(count<N-1) 
 {
 I=0; 
 while(I!=3) 
 {
 h=link[h].nextp; 
 if(link[h].number) 
 I++; 
 } 
 printf(“%4d”,link[h].number); 
 link[h].number=0; 
 count++; 
 } 
 printf(“\nThe last one is”); 
 for(I=1;i<=N;I++) 
 if(link[i].number) 
 printf(“%3d”,lin[i].number); 
}

124.114.28.*

21楼

#include<stdio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define NULL 0
#define LEN 13*sizeof(struct CIRCLE)

struct CIRCLE
{
int num;
struct CIRCLE *next;
}*head;

main()
{
int n=13,i,m,j;
struct CIRCLE *p,*prv;
head=(struct CIRCLE *)malloc(LEN);
p=head,prv=head;
for(i=1; i<=13; i++)
{
p->num=i;
if(i==13) prv->next=head; /*head with tail*/
else 
{
 p++;
 prv->next=p;
 prv++;
}
}
/*p=head;*/ /*p is 13*/
m=0;
i=1;
/*for(i=0,p=head; i<13; i++,p=p->next)
 printf("The last one is NO.%d.\n", p->num);*/
system("cls");
while(m < n-1)
{
j=0;
while(j!=3)
{
p=p->next; 
if(p->num != 0)
 j++;   
}
printf("%d\tdeleted\n",p->num);
p->num=0;
m++;
}
for(i=0,p=head; i<13; i++,p=p->next)
 if(p->num != 0) 
 printf("The last one is NO.%d.\n", p->num);
 getch();
}

22楼

#include "stdio.h"
#include "conio.h"
#define nmax 50
main()
{
 int i,k,m,n,num[nmax],*p;
 printf("please input the total of numbers:");
 scanf("%d",&n);
 p=num;
 for(i=0;i<n;i++)
 *(p+i)=i+1;
 i=0;
 k=0;
 m=0;
 while(m<n-1)
 {
 if(*(p+i)!=0) k++;
 if(k==3)
 {
 *(p+i)=0;
 k=0;
 m++;
 }
 i++;
 if(i==n) i=0;
 }
 while(*p==0) p++;
 printf("%d is left\n",*p);
 getch();
}
如此简单```

222.137.151.*

23楼

#include <stdio.h> 
#define MAX 50 
void main() 

int i,k,n,m,num[MAX],*p; 
printf("请输入总人数"); 
scanf("%d",&n); 
p=num; 
for(i=0;i<n;i++) 
*(p+i)=i+1; 
i=0; 
k=0; 
m=0; 
while(m<n-1) 

if(*(p+i)!=0) 
k++; 

if(k==3) 

*(p+i)=0; 
k=0; 
m++; 

i++; 
if(i==n) 
i=0; 

while(*p==0) 
p++; 
printf("编号为%d的学员被留下:\n",*p); 
}

222.137.151.*

24楼

看这个对不 数组 指针都用了
222.209.220.*

25楼

23楼

58.61.1.*

26楼

#include <stdio.h>

int main(int argc, char **argv)
{
int *person = NULL, current, m, n, i;

printf("please enter n:");
scanf("%d", &n);
printf("please enter m:");
scanf("%d", &m);

person = (int *)malloc(sizeof(int) * n);

for (i = 0; i < n; i ++) {
person[i] = i + 1;
}

person[--n] = 0;
current = 0;
while(n) {
for (i = 1; i < m; i ++) {
current = person[current];
}
person[current] = person[person[current]];
current = person[current];
n --;
}

printf("n = %d\n", ++current);
free(person);

return 0;
}

58.61.1.*

27楼

26楼补充: 
n代表人数;m代表一个数,谁报到这个数就离开,不只是局限于 3 . 我觉得我这个是最高效的。

124.116.44.*

28楼

main()
{printf("最后留下的是n-2号”)
}

222.90.211.*

29楼

#include<stdio.h>
int the_last(int m)
{
int a[100],i,s=0,p=0;
for(i=0;i<m;i++)
a[i]=1;//当a[i]=1时表示人未退出报数循环
for(i=0;i<m;i++,i%=m)//在圈子里循环报数,直到最后一人退出
{
s+=a[i];
if(s==3)//报到3的人退出
{
s=0;
a[i]=0;//修改a[i]的值,a[i]=0表示该人已经退出循环
p++;//退出的人数
}
if(p==m)
break;//报到最后一人,退出循环
}
return(i+1);
}
void main()
{
int n,last;
printf("请输入报数的总人数: ");
scanf("%d",&n);
last=the_last(n);//调用函数
printf("最后退出循环的人是第%d号\n",last);
}

30楼

#include<stdio.h>
int the_last(int m)
{
int a[100],i,s=0,p=0;
for(i=0;i<m;i++)
a[i]=1;//当a[i]=1时表示人未退出报数循环
for(i=0;i<m;i++,i%=m)//在圈子里循环报数,直到最后一人退出
{
s+=a[i];
if(s==3)//报到3的人退出
{
s=0;
a[i]=0;//修改a[i]的值,a[i]=0表示该人已经退出循环
p++;//退出的人数
}
if(p==m)
break;//报到最后一人,退出循环
}
return(i+1);
}
void main()
{
int n,last;
printf("请输入报数的总人数: ");
scanf("%d",&n);
last=the_last(n);//调用函数
printf("最后退出循环的人是第%d号\n",last);
}

发表回复

内 容:
用户名:
  
©2010 Baidu 贴吧协议  意见反馈