| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 878 人关注过本帖
标题:[求助]循环出局的算法是什么?谢谢
只看楼主 加入收藏
zshgwy
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-3-11
收藏
 问题点数:0 回复次数:5 
[求助]循环出局的算法是什么?谢谢
设有M个人围成一圈,从第一个人开始按顺时针方向逐个报数,当数到N时这个人就出局,然后从下一个人重新开始报数,数到N的人出局,如此循环直至所有人出局,请按先后顺序输出出局者的编号。
如:M=5 N=3
则输出结果:3,1,5,2,4
如:M=3 N=6
则输出结果:3,2,1


在此谢过各位!!
搜索更多相关主题的帖子: 算法 出局 
2006-03-11 21:38
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 
请搜索~谢谢,或者参照win-tc 自带的100题(有原题)

叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-03-11 21:41
zshgwy
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-3-11
收藏
得分:0 
可以说具体一点吗?
2006-03-11 21:51
feng1256
Rank: 4
等 级:贵宾
威 望:14
帖 子:2899
专家分:0
注 册:2005-11-24
收藏
得分:0 
参考下(完全复制的)

【程序69】
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出
   圈子,问最后留下的是原来第几号的那位。
1. 程序分析:
2.程序源代码:
#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();
}

叁蓙大山:工謪、稅務、嗣發 抱歉:不回答女人的问题
2006-03-11 21:57
haishanglang
Rank: 1
等 级:新手上路
帖 子:378
专家分:0
注 册:2006-3-2
收藏
得分:0 

小弟最近学数据结构,老师正好出了这个又叫"约瑟夫环"问题,请看小弟用双循环链表写的程序:
#include <malloc.h>
void double_list(int n)
{
struct ring
{
int num;
int password;
struct ring * next;
struct ring * prior;
};
struct ring * p,* q,* r;
int i=0,m;

r=p=q=(struct ring *)malloc(sizeof(struct ring));
p->num=1;
printf("Please input the %d password:\n",i+1);
scanf("%d",&p->password);


while(i<n-1)
{
i++;
p=(struct ring *)malloc(sizeof(struct ring));
q->next=p;
p->prior=q;
q=p;
p->num=i+1;
printf("Please input the %d password:\n",i+1);
scanf("%d",&p->password);
}
p->next=r; //尾结点的后一个位置为头结点
r->prior=p; //头结点的前一个位置为尾结点
p=r; //p指向头结点

printf("The sequence is:\n");
m=p->password; //m!=1;
if(m!=1)
{
while(p->next!=p)
{
for(i=0;i<m;i++)
{
r=p;
p=p->next;
}
printf("%d(%d) ",r->num,r->password);
r->prior->next=r->next;
r->next->prior=r->prior;
free(r);
m=r->password;
}
printf("%d(%d) ",p->num,p->password); //输出最后一个结点
free(p);
}
else
{
while(m==1)
{

printf("%d(%d) ",p->num,p->password);p=p->next;
p->prior=q;
q->next=p;
m=p->password;
}

while(p->next!=p)
{
for(i=0;i<m;i++)
{
r=p;
p=p->next;
}
printf("%d(%d) ",r->num,r->password);
r->prior->next=r->next;
r->next->prior=r->prior;
free(r);
m=r->password;
}
printf("%d(%d) ",p->num,p->password); //输出最后一个结点
free(p);

}
}


main()
{
int n;
printf("Please input the length of the list:\n");
scanf("%d",&n);
double_list(n);
}


2006-03-12 10:11
星期八
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2004-11-3
收藏
得分:0 

//我用循环链表实现的,供大家参考[原创]
#include <iostream.h>
#include <malloc.h>

struct list
{
int data;
struct list *next;
};

int main()
{
int m,n,i;
struct list *h,*p,*s,*pre;
cout << "输入人数M=" ;
cin >> m ;
cout << "输入报数N=" ;
cin >> n ;

h=(list *)malloc(sizeof list); //建头节点
h->data=0;
h->next=NULL;
p=h;
for(i=1;i<=m;i++)
{
s=(list *)malloc(sizeof list);
s->data=i;
s->next=NULL;
p->next=s;
p=s;
}
s->next=h->next; //建循环链表

p=h->next;
pre=s;
while(p!=pre)
{
for(i=1;i<n;i++)
{
p=p->next; pre=pre->next;
}
cout << p->data << " " ;
pre->next=p->next;
p=pre->next;
}
cout << p->data << " " << endl;
return 0;
}

2006-03-12 15:56
快速回复:[求助]循环出局的算法是什么?谢谢
数据加载中...
 
   



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

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