利用java List 实现多项式相加,相乘

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() ;
	}
}

  其实还可以用map实现,而且更简单

时间: 2024-12-19 03:17:43

利用java List 实现多项式相加,相乘的相关文章

链表_多项式相加相乘

加法部分运行成功.乘法仍存在问题,找机会解决,欢迎大家指正. 还有一个问题,C语言函数传地址如何传,是否不需要我这样多次申请内存空间?欢迎交流. 代码如下: 1 #include<stdio.h> 2 #include<malloc.h> 3 4 typedef struct PolyNode *Poly;//定义多项式结构体类型 5 struct PolyNode{ 6 int coef; 7 int expon; 8 struct PolyNode *next; 9 }; 10

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I

SOJ 1002/1003/1004 大整数相加/相乘/相除

三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反过来想到了这几个题目.用JAVA写了以后果然很简单. 1002:大数相加: AC代码: import java.util.*; import java.math.*; public class Main { public static void main(String[] args) { // TO

多项式相加

#include <stdio.h> #include <stdlib.h> typedef struct PolyNode *PtrToNode; //定义链表节点,也就是多项式中的某一项: typedef struct PolyNode { int Coeff; int Exponent; PtrToNode Next; } PolyNode; typedef PtrToNode Polynomial; /************************************

多项式相加实验代码和报告

一.算法模块分析: 将整个项目可分为四部分: 1.将输入字符串链表分析到单链表 2.单链表化简 3.链表值运算 4.输出 二.模块分块实现: 1.将输入字符串链表分析到单链表 分析: 一元稀疏多项式,包含字符有数字(系数和指数) 系数中小数点,指数符号,变量字母(以x为例) 运算符(+和-,其中加减也可以表示正负数) 通过以上分析可以构建如下结构体以用于存储每个单项 并完成相应标志任务 struct Record{ double factor;//记录系数 - int power;//记录次方

利用java开发一个双击执行的小程序

之前我们利用java写了很多东西,但是好像都没有什么实际意义. 因为有意义桌面小程序怎么都得有个界面,可是界面又不太好搞.或者 了解到这一层的人就少之又少了. 呀,是不是还得开辟一些版面来介绍awt和 swing... 算了 先把这个 双击执行的小程序 贡献出来. 这次 在分享一下源代码[以前还没有上传过源代码,布置怎么个搞法] 要求是: 输入一个 后缀名,然后输入所在目录,然后 点击查找,比如我们可以 输入F:\,然后查找 F盘下面的所有后缀名为比如.pdf 举例: 主要是 看了很多 资源,然

多项式相加运算

 多项式相加运算,使用链表实现,代码仍需要改善,这里先初步做个记录 //实现多项式的表示及相加 by Denis #include <stdio.h> #include <malloc.h> #define ture 1 #define false 0 typedef int ElemType; typedef struct LNode{ ElemType coef; //系数 int expn; //指数 struct LNode *next; }polynomia; pol

利用java日期类生成数据仓库维度表

利用java日期类生成数据仓库维度表 Date类: 最基础的日期时间类,返回一个相对日期的毫秒数.精确到毫秒,但不支持日期的国际化和分时区显示.Date 类从Java 开发包(JDK)1.0 就开始进化,当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,这种改进旨在更好的处理日期数据的国际化格式. Calender类: 相对于Date更加强大的时间类,是抽象类,提供了常规的日期修改功能和国际化

利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)

最近看老罗的视频,跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查.其中查询这块,包括普通的查询和利用反射完成的查询,主要包括以下几个函数接口: 1.public Connection getConnection()   获得数据库的连接 2.public boolean updateByPreparedStatement(String sql, List<Object>params)throws SQLException  更新数据库