一元稀疏多项式简单计算器(单链表方法)
基本要求
一元稀疏多项式简单计算器的基本功能是:
(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;
}
}