能告诉我约瑟夫环的实习报告怎样写吗?

zx_cv 2002-03-17 02:44:48
最近我们要写“约瑟夫环”实习报告,可我不会写,能帮我一下吗?
...全文
123 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoukun666 2002-06-07
  • 打赏
  • 举报
回复
源代码:清华出版社-《数据结构--C语言版〉和大连理工出版社-《数据结构》--
wolfqixianfeng 2002-05-19
  • 打赏
  • 举报
回复
电脑爱好者上有详细的解法,好象是2001年第十一期
蚊子王 2002-05-18
  • 打赏
  • 举报
回复
我用C++和汇编都写过
Lawrence444 2002-05-18
  • 打赏
  • 举报
回复
啊呀呀,搞错了

我的那个程序是约瑟夫环的一个变体。说的是第一次杀死人以后,第二次转到的那个人去埋第一个死人,然后站在死人那里,然后再继续数的时候再杀人-埋人-杀人-埋人,所以写的比较繁,见笑了。

你还是用鸿雁的程序吧
DaNiao 2002-05-15
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

void main()
{
int n,k;
while(FIN>>n>>k)
{
if(n==0)break;

bool M[1000];
for(int i=0;i<n;i++)
M[i] = true;

int c = 0;
for(int i=0;i<n;i++)
{
for(for j=0;j<k;j++)
do{ c = (c+1)%n; }while(!M[c]);//刚才这一句写错了

M[c] = false;
cout<<c<<endl;
}
}
DaNiao 2002-05-15
  • 打赏
  • 举报
回复
上面的程序是按胖子的题做的,我们上学的时候
这个题说的是每个人手里都有一个数K[i],
第i个人出队以后再数K[i]个就是i+1号人
DaNiao 2002-05-15
  • 打赏
  • 举报
回复
这么简单的一个问题,怎么让你们写得那么麻烦?

#include <iostream>
using namespace std;

void main()
{
int n,k;
while(FIN>>n>>k)
{
if(n==0)break;

bool M[1000];
for(int i=0;i<n;i++)
M[i] = true;

int c = 0;
for(int i=0;i<n;i++)
{
for(for j=0;j<k;j++)
while(!M[c]){ c = (c+1)%n; }

M[c] = false;
cout<<c<<endl;
}
}
}
kingfighter_han 2002-05-15
  • 打赏
  • 举报
回复
..
Lawrence444 2002-05-14
  • 打赏
  • 举报
回复
呵呵,我当时做acm的时候做过一个,不过是用数组的,比较慢(但是写起来快啊,又不用动态内存)

#include <stdio.h>

int nums[100];

void main()
{
int i,j,ii;
int flag;
int jj;
int tp;
int sp;
int n,k;
while(1)
{
if(scanf("%d %d",&n,&k)==EOF)
break;
if(n==0)
break;
if(n==1)
{
printf("1\n");
continue;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
nums[j]=j+1;
sp = (i+k-1)%n;
nums[sp]=-1;
flag = 1;
sp = (sp+1)%n;
for(j=2*(n-2);j>0;j--)
{
jj = 0;
for(ii=0;ii<k;ii++)
{
tp = (ii+sp+jj)%n;
if(nums[tp]==-1)
{
jj++;
ii--;
}
}
if(!flag)
{
flag = !flag;
if(nums[tp]==1)
{
flag = 2;
break;
}
nums[tp] = -1;
sp = (tp + 1)%n;
}
else
{
flag = !flag;
if(sp==0)
sp = n;
nums[(sp-1)%n] = nums[tp];
nums[tp] = -1;
}
}
if(flag==2)
continue;
for(j=0;j<n;j++)
if(nums[j]==1)
{
printf("%d\n",i+1);
break;
}
if(j<n)
break;
}
}
}

用的输入格式:
n k
n=人数
k=一次数几个
输入
0 0
结束程序。
比如输入
1 1
2 3
0 0
coldcrane 2002-05-14
  • 打赏
  • 举报
回复
int joseph(int n,int m){
if(n==1)return(1);
else return((joseph(n-1,m)+m-1)%n+1);
}
weihere 2002-05-14
  • 打赏
  • 举报
回复
以前做过
如果你用的是单链表来做,那最关键的是要设置两个指针变量来跟踪节点
而问题的处理关键技术是当所要删除的节点为头或尾时如何来使循环报数
继续下去,如果要删除的点不在头尾,那只需要简单的删除、对接
zx_cv 2002-05-13
  • 打赏
  • 举报
回复
虽然你的没对,但我仍然要谢谢你!
zigz 2002-03-18
  • 打赏
  • 举报
回复
水产
kbsoft 2002-03-17
  • 打赏
  • 举报
回复
用链表实现的
你也可以用数组实现
kbsoft 2002-03-17
  • 打赏
  • 举报
回复
typedef char datatype;
typedef struct node{
datatype info;
struct node * next;
}NODE;

void joseph(int n,int s,int m){
int i,j;
NODE *creatlinklist(int); /*建立链表*/
NODE *h,*p,*q,*r;
if(n<s) return;
h=creatlinklist(n);
q=h;
for(i=1;i<s;++i) q=q->next;
p=q->next;
for(i=1;i<n;i++)
{ for(j=1;j<m;++j)
if((p->next!=NULL)&&(q->next!=NULL))
{q=q->next;
p=p->next;}
else if(p->next==NULL)
{q=q->next;
p=h->next;}
else{
q=h->next;
p=p->next;}
printf("%c\n",p->info);
r=p;
if(p->next==NULL)
{p=h->next;
q->next=NULL;}
else {p=p->next;
if(q->next!=NULL) q->next=p;
else h->next=p}
free(r);
}
printf("%c\n",(h->next)->info);
}

NODE *creatlinklist(int n)
{ int i;
NODE *head,*p,*q;
if(n==0)return(NULL);
head=(NODE *)malloc(sizeof *head);
q=head;
for (i=1;i<=n;i++)
{p=(NODE *)malloc(sizeof *head);
printf("输入数据:\n");
p->info=getche();
printf("\n");
q->next=p;
q=p;}
p->next=NULL;
return(head);}

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧