1定义类Term这个类将定义多项式的项。它应该有两个属性,系数和项的指数。
2.要使用LinkedList
3.使用toString 输出
4.使用scanner 输入输出
package com.learn.algorithm.ploy;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
/**
*多项式 相关 运算
*/
public class Ploy {
public static void main(String[] args) {
List<Node> La = init();
List<Node> Lb = init();
System.out.println(polyMulti(La,Lb));
}
private static List<Node> init() {
List<Node> poly = new LinkedList<Node>();
Scanner sc = new Scanner(System.in);
System.out.println("请输入 系数和参数(例如 a,b 表示 aX^b,输入 0,0 结束。):");
while (true) {
String line = sc.nextLine();
if ( vaildate(line) ){
String[] split = line.split(",");
int coefficient = Integer.parseInt(split[0]);
int exponential = Integer.parseInt(split[1]);
if(coefficient == 0 && exponential == 0){
break;
}
poly.add(new Node(coefficient, exponential));
} else {
System.out.println("[" + line + "]输入有误");
}
}
System.out.println(poly);
return poly;
}
/**
* 多项式加法
* @param La
* @param Lb
* @return
*/
public static List<Node> polyPlus(List<Node> La,List<Node> Lb){
List<Node> Lc = new LinkedList<>();
int Sa = La.size(),Sb=Lb.size(),ia=0,ib=0;
while( ia < Sa && ib < Sb ){
if ( La.get(ia).getExponential()< Lb.get(ib).getExponential()){
Lc.add(La.get(ia));
ia ++ ;
} else if( La.get(ia).getExponential() == Lb.get(ib).getExponential() ){
int coe = La.get(ia).getCoefficient() + Lb.get(ib).getCoefficient();
if( coe != 0 ){
Lc.add(new Node(coe,La.get(ia).getExponential()));
}
ia ++ ;
ib ++;
} else {
Lc.add(Lb.get(ib));
ib ++;
}
}
while (ia < Sa) {
Lc.add( La.get(ia++) );
}
while (ib < Sb) {
Lc.add( Lb.get(ib++) );
}
return Lc ;
}
/**
* 多项式加法(无序)
* @param La
* @param Lb
* @return
*/
public static List<Node> polyPlus_update(List<Node> La,List<Node> Lb){
int Sa = La.size(),Sb=Lb.size(),ia=0,ib=0;
while( ia < Sa ){
Node node = La.get(ia);
Node nodeByExp = getNodeByExp( Lb,node.getExponential() );
if (nodeByExp != null) {
if (node.getCoefficient() + nodeByExp.getCoefficient() == 0) {
Lb.remove(nodeByExp);
} else{
nodeByExp.setCoefficient( node.getCoefficient() + nodeByExp.getCoefficient() );
}
} else {
Lb.add(node);
}
ia ++;
}
return Lb ;
}
/**
* 多项式乘法
* @param La
* @param Lb
* @return
*/
public static List<Node> polyMulti(List<Node> La,List<Node> Lb){
List<Node> Lc = new LinkedList<>();
int Sa = La.size(),Sb=Lb.size(),ia=0,ib=0;
while( ia < Sa ){
ib = 0;
Node Na = La.get(ia);
while (ib < Sb) {
Node Nb = Lb.get(ib);
int exp = Nb.getExponential() + Na.getExponential();//指数相加
int coe = Nb.getCoefficient() * Na.getCoefficient();//系数相乘
Node nodeByExp = getNodeByExp( Lc, exp);
if (nodeByExp != null) {
if (coe + nodeByExp.getCoefficient() == 0) {
Lc.remove(nodeByExp);
} else{
nodeByExp.setCoefficient( coe+ nodeByExp.getCoefficient() );
}
} else {
Lc.add(new Node(coe,exp));
}
ib ++ ;
}
ia ++;
}
return Lc ;
}
/**
* 根据系数 寻找对应的项,没有则返回null
* @param p
* @param exp
* @return
*/
public static Node getNodeByExp(List<Node> p,Integer exp){
if (exp == null || p == null ){
return null;
}
for (Node node : p) {
if (node.exponential == exp) {
return node;
}
}
return null;
}
/**
* 验证输入字符串的合法性
* @param s
* @return
*/
public static boolean vaildate(String s){
return s.matches("[-]{0,1}[0-9]+[,]{1}[0-9]+");
}
}
/**实体类
*
*/
class Node {
Integer coefficient =0; //系数
Integer exponential =0; //指数
public Node(Integer coefficient,Integer exponential){
this.coefficient = coefficient;
this.exponential = exponential;
}
public Integer getCoefficient() {
return coefficient;
}
public void setCoefficient(Integer coefficient) {
this.coefficient = coefficient;
}
public Integer getExponential() {
return exponential;
}
public void setExponential(Integer exponential) {
this.exponential = exponential;
}
@Override
public String toString() {
return this.coefficient.toString() + "X^" + this.exponential.toString() ;
}
}