约瑟夫环 数组与链表实现

来源:互联网 发布:红蜘蛛多媒体软件 编辑:程序博客网 时间:2024/05/16 19:24
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,

数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列.

1、数组实现

void JosephArrary(int a[],int n,int k){int count,len,i,j,m;int *b=new int[n];count=0;len=n;i=0;j=0;m=0;while(len>0){if(a[j]!=-10000)   //剔除0的影响  如果设置a[j]!=0,输入数组中有0,不能通过{count++;if(count==k){b[m++]=a[j];a[j]=-10000;count=0;len--;}}j++;if(j==n)   j=0;}for(i=0;i<n;i++)cout<<b[i]<<" ";cout<<endl;delete [] b;}
2、链表实现

struct node {int data;node *next;};
node * CreateLink(int n){node *p,*q,*head;head=new node;q=new node;head=q=NULL;int data;for(int i=0;i<n;i++){p=new node;cin>>data;p->data=data;if(head==NULL)head=q=p;else{q->next=p;q=p;}}q->next=head;return q;   //考虑到报数为1出环的情况}
void JosephLink(node *head,int len,int k){node *p,*t;p=new node;int count,n;count=0;n=0;p=head;while(p){t=p->next;count++;if(count==k){cout<<t->data<<" ";count=0;p->next=p->next->next;delete t;n++;if(n==len)return;}p=p->next;}cout<<endl;}






0 0
原创粉丝点击