package com.baidu.line;
import java.util.Scanner;
public class Dolynomial {
private Node first;
private Node last;
private int N;
private class Node{
int coef; //存放系数
int expo; //存放指数
Node next;
}
public boolean isEmpty() {
return N == 0;
}
public int size() {
return N;
}
public void enqueue(int coef, int expo) {
Node oldlast = last;
last = new Node();
last.coef = coef;
last.expo = expo;
last.next = null;
if(N == 0) {
first = last;
} else
oldlast.next = last;
N++;
}
/*public void insertion(Node n, int index) {
Node temp = first;
while(index-- > 0) {
temp = temp.next;
}
n.next = temp.next;
temp.next = n;
}*/
public static Dolynomial addition(Dolynomial D1, Dolynomial D2) {
Dolynomial temp = new Dolynomial();
Node node1 = D1.first;
Node node2 = D2.first;
int n1 = D1.size();
int n2 = D2.size();
while(n1 > 0 && n2 > 0) {
if(node1.expo > node2.expo) {
temp.enqueue(node1.coef, node1.expo);
node1 = node1.next;
n1--;
} else if(node1.expo < node2.expo) {
temp.enqueue(node2.coef, node2.expo);
node2 = node2.next;
n2--;
} else {
if(node1.coef + node2.coef != 0)
temp.enqueue(node1.coef + node2.coef, node1.expo);
node1 = node1.next;
node2 = node2.next;
n1--;
n2--;
}
}
while(n1-- > 0) {
temp.enqueue(node1.coef, node1.expo);
node1 = node1.next;
}
while(n2-- > 0) {
temp.enqueue(node2.coef, node2.expo);
node2 = node2.next;
}
return temp;
}
//读入一个多项式
public static Dolynomial read() {
Dolynomial temp = new Dolynomial();
Scanner sc = new Scanner(System.in);
System.out.println("请输入多项式项数:");
int N = sc.nextInt();
for (int i = 0; i < N; i++) {
System.out.println("请输入第" + (i + 1) + " 项,其中第一个为系数,第二个为指数");
int coef = sc.nextInt();
int expo = sc.nextInt();
temp.enqueue(coef, expo);
}
return temp;
}
//多项式的乘法
public Dolynomial multi(Dolynomial D1, Dolynomial D2) {
Dolynomial temp = new Dolynomial();
Node node1 = D1.first;
Node node2 = D2.first;
int n1 = D1.size();
int n2 = D2.size();
while(n2-- > 0) {
temp.enqueue(node1.coef * node2.coef, node1.expo + node2.expo);
node2 = node2.next;
}
while(--n1 > 0) {
//System.out.println("几条这样的语句就是几次循环~");
Node node3 = temp.first;
node1 = node1.next;
node2 = D2.first;
n2 = D2.size();
while(n2 > 0) {
//System.out.println("这个也一样哦!");
int c = node1.coef * node2.coef;
int e = node1.expo + node2.expo;
while(node3.next != null && node3.next.expo > e)
node3 = node3.next;
if(node3.next != null && node3.next.expo == e) {
//指数相等,直接相加
node3.next.coef += c;
if(node3.next.coef == 0) {
node3 = node3.next.next;
}
} else {
//插入节点
Node p = new Node();
p.coef = c;
p.expo = e;
p.next = node3.next;
node3.next = p;
temp.N++;
}
n2--;
node2 = node2.next;
}
}
return temp;
}
/**
* @param args
*/
public static void main(String[] args) {
Dolynomial d1, d2, result1, result2;
d1 = read();
d2 = read();
System.out.println(d1.size() + d2.size());
System.out.println("分割线-------------------");
result1 = addition(d1, d2);
Node temp1 = result1.first;
for (; temp1 != null; temp1 = temp1.next) {
System.out.println(temp1.coef + " " + temp1.expo);
}
System.out.println("分割线-------------------");
result2 = d1.multi(d1, d2);
Node temp2 = result2.first;
System.out.println(result2.size());
for (; temp2 != null; temp2 = temp2.next) {
System.out.println(temp2.coef + " " + temp2.expo);
}
}
}
总结:
在刚看到这题目时,觉得很简单,可真正做起来还是问题百出,差不多花了三四个小时,效率太低,经常犯一些简单、低级的错误,包括一些命令的不熟悉。俗话说的的好,三天不写手生,希望自己以后勤加练习。