鉴于毕设是关于算法的,我又是用Java实现的,所以开始学习Java实现的一些算法。
第一个就是约瑟夫环,因为以前学数据结构的时候用C写过。不知道自己当时太笨还是怎么着,写出来的代码一长串,怎么看怎么麻烦,Java的简单多了。
1.Java循环链表版的
1 |
public class Josephus { static class Node{ int val; Node next; Node(int v){ val=v; } }//成员类,代表节点,类似于数据结构中的结构体 public static void main(String[] args) { int N=9;//这个表示总人数 int M=5;//数到几的人出列 Node t=new Node(1);//头节点单列出来,方便形成循环链表 Node x=t; for(int i=2;i<=N;i++)x=(x.next=new Node(i));//建立单向链表 x.next=t;//最后一个节点的next指向第一个节点,形成循环链表 System.out.println("出圈的顺序为:"); while(x!=x.next){ for(int i=1;i<M;i++) x=x.next; //此时x是将出列的节点的前一个节点 System.out.print(x.next.val+" "); x.next=x.next.next; } System.out.println(); System.out.println("Survivors is "+x.val); }//end main } |
2.这个是当初用C写的
1 |
#include ><stdio.h> #define size 7 typedef struct node{ int data; int pass; struct node * next; }node,*LinkNode; void main() { LinkNode head,p,s,q,r; int x,y,n,m,i; head=(node *)malloc(sizeof(node)); p=head; for(n=1;n<=size;n++) { printf("\n the %d number is :",n); scanf("%d",&x); printf("\n the %d pass is :",n); scanf("%d",&y); s=(node *)malloc(sizeof(node)); s->data=x; s->pass=y; p->next=s; p=s; } head=head->next; p->next=head; m=20; q=p->next; while(q->next->next!=q) { if(m==2){ r=q->next; m=r->pass; printf(" %d",r->data); q->next=r->next; q=q->next; } if(m==1){ r->next=q; r->next=q->next; m=q->pass; printf(" %d",q->data); q=r->next; } else{ for(i=1;i<=m-2;i++){ q=q->next; } r=q->next; q->next=r->next; m=r->pass; printf(" %d",r->data); q=q->next; } } r=q->next; if(m%2==0){ printf(" %d %d",r->data,q->data); } else { printf(" %d %d",q->data,r->data); } } |
3.今天还在网上看了一个更简单的,先保存起来,还需要进一步的研究。网址是http://www.9php.com/FAQ/cxsjl/c/2007/03/403506277877.html
1 |
int fun(int n, int m) { int i, r = 0; for (i = 2; i <= n; i++) r = (r + m) % i; return r+1; } |
4.还有一种是用数组实现的Java版的约瑟夫环,暂时还没太懂。