java版 一元稀疏多项式简单计算器

本文介绍了一款使用单链表实现的一元稀疏多项式简单计算器,具备输入、输出多项式及进行多项式相加、相减等功能。文章提供了详细的代码实现,并通过测试数据验证了其正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

	一元稀疏多项式简单计算器(单链表方法)
	
	基本要求

一元稀疏多项式简单计算器的基本功能是:
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
(3)多项式a和b相加,建立多项式a+b;
(4)多项式a和b相减,建立多项式a-b。
测试数据
(1)(2x+5x3-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7)
(2)(6x-3-X+4.4X2-1.2X9)-(-6X-3+5.4X2-X2+7.8X15)=(-7.8X15-1.2X9+12X-3-X)
(3)(1+X+X2+X3+X4+X5)+(-X3-X4)=(1+X+X2+X5)
(4)(X+X3)+(-X-X3)=0

测试数据全部通过。不过可能还不够完善。`

import java.util.Scanner;

/** 

* @author 作者 skx 
*/
/** 
操作说明:  如果要输入多项式 2^x+5x^3-3.1x^11  则应该输入:
*  		2 1
*  		5 3
*  		-3.1 11
*  		0 0
*  		以0 0结束输入
*/

class LinkedList{
	Scanner in=new Scanner(System.in);
	Node head=new Node(0,0);

	public void create(double c,int e) {
		Node node=new Node();
		node.coef=c;
		node.exp=e;
		Node temp=head;
		while(temp.next!=null) {
			temp=temp.next;
		}
		temp.next=node;
	}

	public void show() {
		Node temp=head.next;
		while(true) {
			if(temp==null) {
				break;
			}
			if(temp==head.next) {
				
			}
			else {
				if(temp.coef>0)
				System.out.print("+");
				else if(temp.coef<0) {
				}
			}
			if(temp.coef==0) {
				
			}
			//
			else if(temp.coef==1) {
				if(temp.exp==0) {
					System.out.print("1");
				}
				else if(temp.exp==1) {
					System.out.print("X");
				}
				else {
					System.out.print("X^"+temp.exp);
				}
			}
			//
			else if(temp.coef==-1) {
				if(temp.exp==0) {
					System.out.print("-1");
				}
				else if(temp.exp==1) {
					System.out.print("-X");
				}
				else {
					System.out.print("-X^"+temp.exp);
				}
			}
			//
			else if(temp.coef>1||temp.coef<0) {
				if((int)temp.coef==temp.coef) {//是整数 如7.0=7
					if(temp.exp==0) {
						System.out.print((int)temp.coef);
					}
					else if(temp.exp==1) {
						System.out.print((int)temp.coef+"X");
					}
					else {
						System.out.print((int)temp.coef+"X^"+temp.exp);
					}
				}
				else { //如7.2 
				if(temp.exp==0) {
					System.out.print(temp.coef);
				}
				else if(temp.exp==1) {
					System.out.print(temp.coef+"X");
				}
				else {
					System.out.print(temp.coef+"X^"+temp.exp);
				}
			}
			}
			//
			temp=temp.next;
		}
	}
	
//	把链表的相同指数相加减,使链表中无带相同的系数的数。
	public void init() {
//		int temp;//exp
		double temp2;//coef
		Node curNode=head;
		while(curNode!=null) {
			Node nextNode=curNode.next;
			while(nextNode!=null) {
				if(nextNode.exp==curNode.exp&&curNode.exp!=0) {
					temp2=nextNode.coef+curNode.coef;//系数
					curNode.coef=temp2;
					if(curNode.next.next==null) {
						curNode.next=null;
					}
					else {
						curNode.next=curNode.next.next;
					}
				}
				nextNode=nextNode.next;
			}
			curNode=curNode.next;
		}
	}
//	相加
	public Node add(Node head1,Node head2) {
//		用控制变量法,head2中的每个数与head1中的一个数相比,相同指数则相加,指数都与head1中次数不同,则新链表加入head1中此值。
		Node temp1=head1.next;
		Node temp2=head2.next;
		Node temp=head;
		while(temp1!=null) {
			temp2=head2.next;
			while(temp2!=null&&temp2.exp!=temp1.exp) {
				temp2=temp2.next;
			}
			if(temp2!=null) {
			if(temp2.exp==temp1.exp) {
				double a=temp2.coef+temp1.coef;
				Node node=new Node();
				node.coef=a;
				node.exp=temp2.exp;
				if(head==null) {
					head=node;
				}
				while(temp.next!=null) {
					temp=temp.next;
				}
				temp.next=node;
				temp2=temp2.next;
			}
		}
			else { //此时temp2为空,说明head2中无与head1中此系数相同得数。
				while(temp.next!=null) {
					temp=temp.next;
				}
				Node node=new Node();
				node.coef=temp1.coef;
				node.exp=temp1.exp;
				temp.next=node;
			}
			temp1=temp1.next;
		}
		
//	再来一遍,因为只把head1中没有相同系数的数相除了,还有head2
		temp1=head1.next;
		temp2=head2.next;
		while(temp2!=null) {
			temp1=head1.next;
			while(temp1!=null&&temp1.exp!=temp2.exp) {
				temp1=temp1.next;
			}
			if(temp1!=null) {
		
			}
			else { //此时temp2为空,说明head2中无与head1中此系数相同得数。
				while(temp.next!=null) {
					temp=temp.next;
				}
				Node node=new Node();
				node.coef=temp2.coef;
				node.exp=temp2.exp;
				temp.next=node;
			}
			temp2=temp2.next;
		}
		return head;
	}
//	相减
	public Node sub(Node head1,Node head2) {
//		用控制变量法,head2中的每个数与head1中的一个数相比,相同指数则相加,指数都与head1中次数不同,则新链表加入head1中此值。
		Node temp1=head1.next;
		Node temp2=head2.next;
		Node temp=head;
		while(temp1!=null) {
			temp2=head2.next;
			while(temp2!=null&&temp2.exp!=temp1.exp) {
				temp2=temp2.next;
			}
			if(temp2!=null) {
			if(temp2.exp==temp1.exp) {
				double a=temp1.coef-temp2.coef;
				Node node=new Node();
				node.coef=a;
				node.exp=temp2.exp;
				if(head==null) {
					head=node;
				}
				while(temp.next!=null) {
					temp=temp.next;
				}
				temp.next=node;
				temp2=temp2.next;
			}
		}
			else { //此时temp2为空,说明head2中无与head1中此系数相同得数。
				while(temp.next!=null) {
					temp=temp.next;
				}
				Node node=new Node();
				node.coef=temp1.coef;
				node.exp=temp1.exp;
				temp.next=node;
			}
			temp1=temp1.next;
		}
		
//	再来一遍,因为只把head1中没有相同系数的数相除了,还有head2
		temp1=head1.next;
		temp2=head2.next;
		while(temp2!=null) {
			temp1=head1.next;
			while(temp1!=null&&temp1.exp!=temp2.exp) {
				temp1=temp1.next;
			}
			if(temp1!=null) {
		
			}
			else { //此时temp2为空,说明head2中无与head1中此系数相同得数。
				while(temp.next!=null) {
					temp=temp.next;
				}
				Node node=new Node();
				node.coef=-temp2.coef;
				node.exp=temp2.exp;
				temp.next=node;
			}
			temp2=temp2.next;
		}
		return head;
	}
	public Node sort() {//类似于插入排序
		Node nextNode=null;
		double temp=0;
		int temp2=0;
		Node curNode=head;
		while(curNode.next!=null) {
			nextNode=curNode.next;
			while(nextNode!=null) {
//				由大到小排序
				if(curNode.exp<nextNode.exp) {
					temp=curNode.coef;
					temp2=curNode.exp;
					curNode.coef=nextNode.coef;
					curNode.exp=nextNode.exp;
					nextNode.coef=temp;
					nextNode.exp=temp2;
				}
				nextNode=nextNode.next;
			}
			curNode=curNode.next;
		}
		return head;
		
	}
//	把0,0插入到头节点位置,因为sort后头节点有值,不能show出
	public void insert(double c,int e) {
		Node node=new Node();
		node.coef=c;
		node.exp=e;
		node.next=head;
		head=node;
	}
}
public class 多项式计算器 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		System.out.println("1: 建立多项式");
		System.out.println("2: 输出多项式a");
		System.out.println("3: 输出多项式b");
		System.out.println("4: 输出多项式a+b");
		System.out.println("5: 输出多项式a-b");
		LinkedList list1=new LinkedList();
		LinkedList list2=new LinkedList();
		LinkedList list3=new LinkedList();
		LinkedList list4=new LinkedList();
		while(true) {
			int a=in.nextInt();
			if(a==1) {
				System.out.println("请输入第一个多项式,输入格式: 系数 指数,输入0 0结束");//2 2表示2*x^2
				double c=in.nextDouble();//系数
				int e=in.nextInt();//指数
				while(true) {
					if(c==0&&e==0) {
						break;
					}
					list1.create(c,e);
					c=in.nextDouble();
					e=in.nextInt();
					
				}
				System.out.println("请输入第二个多项式,输入格式: 系数 指数,输入0 0结束");//2 2表示2*x^2
				double c2=in.nextDouble();//系数
				int e2=in.nextInt();//指数
				while(true) {
					if(c2==0&&e2==0) {
						break;
					}
					list2.create(c2,e2);
					c2=in.nextDouble();
					e2=in.nextInt();
				}
				System.out.println("输入完成");
			}
			else if(a==2) {
				System.out.print("a=");
				list1.show();
			}
			else if(a==3) {
				System.out.print("b=");
				list2.show();
			}
			else if(a==4) {
				System.out.print("a+b=");
				list1.init();
				list2.init();//初始化,出去相同系数的元素
				list3.head=list3.add(list1.head,list2.head);
				list3.sort();
				list3.insert(0, 0);
				list3.show();
				if((list3.head.next.coef==0)) {
					System.out.print("0");
				}
			} 
			else if(a==5) {
				System.out.print("a-b=");
				list1.init();
				list2.init();//初始化,出去相同系数的元素
				list3.head=list3.sub(list1.head, list2.head);
				list3.sort();
				list3.insert(0, 0);
				list3.show();
				if((list3.head.next.coef==0)) {
					System.out.print("0");
				}
			}
//			做乘法把+-号换成*就行了
			else if(a==0) {
				System.exit(0);
			}
		}
	}
}
class Node{
	Node next;
	double coef;//系数
	int exp;//指数
	public Node() {
		
	}
	public Node(int a,int b) {
		this.coef=a;
		this.exp=b;
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值