Java,C实现约瑟夫环,一元多项式运算器

18 篇文章 0 订阅
13 篇文章 0 订阅

1 约瑟夫环问题描述:(初始密码为m)

约瑟夫环问题是循环链表的经典应用:具体描述如下:n 个人围成一个圆圈,首先第 1 个人从 1 开始一个人一个人顺时针报数,报到第 m 个人,令其出列。然后再从下一 个人开始从 1 顺时针报数,报到第 m 个人,再令其出列,…,如此下去,求出列顺序。

使用C实现

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int id;
	int password;
	struct node *next;
}lsnode;
lsnode * createlist(int n);
void printflist(lsnode *list);
void Jose(lsnode *phead,int ipassword);
int main(void){
	 lsnode *phead=NULL;
	int n,m;
	printf("请输入人数\n");
	scanf("%d",&n);
	printf("请输入初始密码:\n");
	scanf("%d",&m);
	phead=createlist(n);
lsnode *pt=phead->next;
printflist(pt);
	Jose(pt,m);
}
lsnode * createlist(int n){
	int password;
	lsnode *phead=NULL,*pcur,*pnew;
	phead=(lsnode *)malloc(sizeof(lsnode));;
	pcur=phead;
	for(int i=1;i<=n;i++){
		printf("输入第%d个数的密码:",i);
		scanf("%d",&password);
		pnew=(lsnode *)malloc(sizeof(lsnode));
		pnew->id=i;
		pnew->password=password;
		phead->next=pnew;
		phead=pnew;
		} 
		phead=pcur;
		pnew->next=phead->next;
	
	printf("完成单链表的创建"); 
	return phead;
}
void printflist(lsnode *list){
	lsnode *pcur=list;
	printf("--ID-- --Password--\n");
	do{
		printf("%3d %7d\n",pcur->id,pcur->password);
		pcur=pcur->next;
	}while(pcur->next!=list);
}

void Jose(lsnode *phead,int ipassword){
	int icounter=0;
	int iflag=1;
	lsnode *pprv,*pcur,*pdel;
	pprv=pcur=phead;
	while(pprv->next!=phead)
		pprv=pprv->next;
	while(iflag){
		for(icounter=1;icounter<ipassword;icounter++){
			pprv=pcur;
			pcur=pcur->next;
		}
		if(pprv==pcur) iflag=0;
		pdel=pcur;
		pprv->next=pcur->next;
		pcur=pcur->next;
		ipassword=pdel->password;
		printf("第%d 个人出列(密码:%d)\n",pdel->id,pdel->password);
	}
}

Java实现

public class Main {
	static class Node{
		int val,num;
		Node next;
		Node(int n,int v){
			num=n;
			val=v;
		}
	}
public static void main(String[] args) {
	Scanner input=new Scanner(System.in);
	int n=7;
	int m=20;
	int y;
	Node t=new Node(1,3);
	Node x=t;
	for(int i=2;i<=n;i++) {
		y=input.nextInt();
		x=(x.next=new Node(i,y));
	}
	x.next=t;
	System.out.println("依次出来的顺序为:");
	while(x!=x.next) {
		for(int i=1;i<m;i++) {
			x=x.next;
		}
		m=x.next.val;
		System.out.println(x.next.num);
		x.next=x.next.next;
	}
	System.out.println(x.num);
}}

2一元多项式的加减

C语言实现:

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	float coef;
	int expn;
	struct node *next;
}lsnode;
lsnode *CreatePoly(){
	lsnode *head,*rear,*s;
	int c,e;
	head=rear=(lsnode *)malloc(sizeof(lsnode));
	head->next=NULL;
	printf("请输入两个整数\n"); 
	scanf("%d%d",&c,&e);
	while(c!=0){
		s=(lsnode *)malloc(sizeof(lsnode));
		s->coef=c;
		s->expn=e;
		rear->next=s;
		rear=s;
		printf("请输入两个整数\n");
		scanf("%d%d",&c,&e); 
	}
	s->next=NULL;
	return(head);
}
void PrintPolyn(lsnode *p){
	lsnode *q=p;
	int flag=1;
	if(!q){
		putchar('0');
		printf("\n");
		return;
	}
	while(q){
		if(q->coef>0&&flag!=1)	putchar('+');
		if(q->coef!=1&&q->coef!=-1){
			printf("%g",q->coef);
			if(q->expn==1)	putchar('X');
			else if(q->expn)	printf("X^%d",q->expn);
		}
		else{
			if(q->coef==1){
				if(!q->expn)	putchar('1');
				else if(q->expn==1)	putchar('X');
				else printf("X^%d",q->expn);
			}
			if(q->coef==-1){
				if(!q->expn)	printf("-1");
				else if(q->expn==1)	putchar('-X');
				else printf("-X^%d",q->expn);
			}
		}
		q=q->next;
		flag++;
	}
	printf("\n");
}
lsnode* AddPloyn(lsnode *pa,lsnode *pb){
	lsnode *qa=pa;
	lsnode *qb=pb;
	lsnode *headc,*pc,*qc;
	pc=(lsnode *)malloc(sizeof(lsnode));
	pc->next=NULL;
	headc=pc;
	while(qa!=NULL&&qb!=NULL){
		qc=(lsnode *)malloc(sizeof(lsnode));
		if(qa->expn<qb->expn){
			qc->coef=qa->coef;
			qc->expn=qa->expn;
			qa=qa->next;
		}
		else if(qa->expn==qb->expn){
			qc->coef=qa->coef+qb->coef;
			qc->expn=qa->expn;
			qa=qa->next;
			qb=qb->next;
		}
		else{
			qc->coef=qb->coef;
			qc->expn=qb->expn;
			qb=qb->next;
		}
		if(qc->coef!=0){
			qc->next=pc->next;
			pc->next=qc;
			pc=qc;
		}
		else free(qc);
	}
	while(qa!=NULL){
		qc=(lsnode *)malloc(sizeof(lsnode));
		qc->coef=qa->coef;
		qc->expn=qa->expn;
		qa=qa->next;
		qc->next=pc->next;
		pc->next=qc;
		pc=qc;
	}
	while(qb!=NULL){
		qc=(lsnode *)malloc(sizeof(lsnode));
		qc->coef=qb->coef;
		qc->expn=qb->expn;
		qb=qb->next;
		qc->next=pc->next;
		pc->next=qc;
		pc=qc;
	}
	return headc;
}

int main(void){
	lsnode *phead=(lsnode *)malloc(sizeof(lsnode));
	lsnode *qhead=(lsnode *)malloc(sizeof(lsnode));
	phead=CreatePoly();
	qhead=CreatePoly();
	phead=phead->next;
	qhead=qhead->next;
	PrintPolyn(phead);
	PrintPolyn(qhead);
	phead=AddPloyn(phead,qhead);
	phead=phead->next;
	PrintPolyn(phead);
}

Java实现

唉,不想写了,有空再补上,网上找来的代码

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值