| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 551 人关注过本帖
标题:实在是不会解,求阻
只看楼主 加入收藏
blackbrod
Rank: 1
等 级:新手上路
帖 子:52
专家分:0
注 册:2006-10-24
收藏
 问题点数:0 回复次数:5 
实在是不会解,求阻

M个人围成一圈,从第一个人开始顺序报号1,2,3....N凡报到"N"者退出圈子.找出最后
留在圈子中的人原来的序号.(N<M),看了下这个题目实在是想不出一个好的方法,各位大虾,谢谢了,最好是代码啊

搜索更多相关主题的帖子: 最好 
2006-11-01 14:38
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 
给你个函数代码,出圈,自己慢慢看
void Josegh(void)
{ int i,j,s1,w,q[100];
for(i=0;i<M;i++) q[i]=0;
s1=s;
for(i=1; i<=M; i++) p[i-1]=i;
for(i=M; i>=2; i--)
{ s1=(s1+N-1)%i;
if(s1==0) s1=i;
w=p[s1-1];
for(j=s1; j<i; j++) p[j-1]=p[j];
p[i-1]=w;
}
for(i=0,j=M-1;i<n,j>=0;i++,j--) q[j]=p[i];
for(i=0;i<M;i++)
p[i]=q[i];
}

[此贴子已经被作者于2006-11-1 15:21:35编辑过]


新王登基,血流成河!
2006-11-01 15:19
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 
经典的 Josephus 游戏(约瑟夫环)。

[此贴子已经被作者于2006-11-1 16:50:57编辑过]



欢迎加入 MVC 技术讨论群(新群:90093426)
2006-11-01 16:48
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

#include<stdio.h>
#include<malloc.h>


typedef struct node{
int info;
struct node *next;
};

node *tbuildhlink(int n) /*带头节点的尾插法*/
{
node *head,*s,*p2;
int i=1;

head=(node *)malloc(sizeof(node));
p2=head;
while(i<=n)
{
s=(node *)malloc(sizeof(node));
s->info=i;
p2->next=s;
p2=s;
i++;
}
if(p2) p2->next=head;
return(head);
}

void Display(struct node* head)
{
node *p;
p=head->next;
if(!p)
{
printf("\nthe hlink is empty!");
}
else
{
printf("\nthe value of the hlink is:\n");
while(p!=head)
{
printf("%d--->",p->info);
p=p->next;
}
}
printf("^\n");
}
int delete_node(struct node *head,int n,int m)
{
int count=1,sum=n;
struct node *p,*pre;
pre=head;
p=pre->next;
while(sum>1)
{
if(p==head)
{
p=p->next;
}
if(count<m)
{
pre=p;
p=p->next;
count++;
}
if(count==m)
{
if(p==head)
{
p=p->next;
}
//printf("第%d个人出列.\n",p->info);
pre->next=p->next;
free(p);
p=pre->next;
count=1;
sum--;
}
}
return(pre->info);
}


int main()
{
struct node* head;
int n,m;

printf("输入n m:");
scanf("%d%d",&n,&m);
head=tbuildhlink(n);
Display(head);
//delete_node(head);
printf("最后剩下第%d个.\n",delete_node(head,n,m));
return(0);
}


倚天照海花无数,流水高山心自知。
2006-11-01 21:44
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 

有错,不知道是不是编译器的原因还是什么


新王登基,血流成河!
2006-11-01 23:29
wyzn12
Rank: 1
等 级:新手上路
帖 子:129
专家分:0
注 册:2006-10-28
收藏
得分:0 

我编了一个,可以在tc上运行,其做法是建立一个环链表,然后用 i 计数,当i%N==0时,打印p->num表示num出列
然后拆掉并释放结点p,再把下一结点赋予p...直到拆完为止。但要分N==1 和大于1两种情况

#include<malloc.h>
#define LEN sizeof(struct person)
struct person
{
int num;
struct person *next;
};
struct person *creat(int n)
{
struct person *head,*p1,*p2;
int i;
p1=p2=(struct person *)malloc(LEN);
head=NULL;
for(i=1;i<=n;i++)
{
if(i==1)
{head=p1;head->num=1;}
else
p2->next=p1;
p2=p1;
p1=(struct person *)malloc(LEN);
p1->num=i+1;
}
p2->next=head;
return(head);
}
main()
{
struct person *head,*p,*p2;
int M,N;
int i,j;
i=1;
j=1;
printf("\ninput M=:");
scanf("%d",&M);
printf("input N=:");
scanf("%d",&N);
head=creat(M);
p=head;
printf("\noutput:\n");
while(p!=NULL&&j<=M)
{
if(N==1)
{j=j+1;
printf("=>%d",p->num);
p=p->next;
}
else
{
p2=p;
p=p->next;
i=i+1;
if(i%N==0)
{
p2->next=p->next;
printf("=>%d",p->num);
p->next=NULL;
free(p);
p=p2->next;
i=i+1;
j=j+1;
}
}
}
getch();
}

[此贴子已经被作者于2006-11-3 8:40:26编辑过]


新王登基,血流成河!
2006-11-03 00:09
快速回复:实在是不会解,求阻
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018233 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved