约瑟夫环、单项式多项式算子的 Java、C 语言实现
最编程
2024-03-02 21:07:04
...
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实现
唉,不想写了,有空再补上,网上找来的代码
上一篇: 单项式多项式加法数组
下一篇: [抽象代数]环论与域论