多项式除法Java实现

​​​​​​​

 

单项式实体类

例如:在2x^{2}+1中,2x^{2}代表一个 PolynomialEntity 类对象

/**
 * 多项式中表示每一项的实体类
 * 例如:2x^2+1 中,2x^2代表一个 PolynomialEntity 类
 */
public class PolynomialEntity {
	
	/**
	 * 系数
	 */
	private FractionEntity coefficient;
	
	/**
	 * 幂
	 */
	private Integer power;
	
	public PolynomialEntity() {
	}
	
	public PolynomialEntity(FractionEntity coefficient, Integer power) {
		this.coefficient = coefficient;
		this.power = power;
	}
	
	public FractionEntity getCoefficient() {
		return coefficient;
	}
	
	public void setCoefficient(FractionEntity coefficient) {
		this.coefficient = coefficient;
	}
	
	public Integer getPower() {
		return power;
	}
	
	public void setPower(Integer power) {
		this.power = power;
	}
	
	/**
	 * 判断系数是否为整数1
	 */
	private int isIntegerOne() {
		if (this.coefficient.getMolecule() % this.coefficient.getDenominator() == 0) {
			//	为整数情况
			if (this.coefficient.getMolecule() / this.coefficient.getDenominator() == 1) {
				return 1;
			} else if (this.coefficient.getMolecule() / this.coefficient.getDenominator() == -1) {
				return -1;
			} else {
				return 0;
			}
		}
		return 0;
	}
	
	@Override
	public String toString() {
		if (isIntegerOne() == 1 && power == 0) {
			return "1";
		} else if (isIntegerOne() == -1 && power == 0) {
			return "-1";
		} else if (isIntegerOne() == 0 && power == 0) {
			return coefficient.toString();
		} else if (isIntegerOne() == 1 && power == 1) {
			return "x";
		} else if (isIntegerOne() == -1 && power == 1) {
			return "-x";
		} else if (isIntegerOne() == 0 && power == 1) {
			return coefficient.toString() + "x";
		} else {
			return coefficient.toString() + "x^" + power;
		}
	}
	
}

分式实体类

/**
 * 分式实体类,例如:1 / 3
 */
public class FractionEntity {
	
	/**
	 * 分子
	 */
	private int molecule;
	/**
	 * 分母
	 */
	private int denominator;
	
	public FractionEntity() {
	}
	
	public FractionEntity(int molecule, int denominator) {
		this.molecule = molecule;
		this.denominator = denominator;
	}
	
	public int getMolecule() {
		return molecule;
	}
	
	public void setMolecule(int molecule) {
		this.molecule = molecule;
	}
	
	public int getDenominator() {
		return denominator;
	}
	
	public void setDenominator(int denominator) {
		this.denominator = denominator;
	}
	
	@Override
	public String toString() {
		return this.molecule % this.denominator == 0 ? Integer.toString(this.molecule / this.denominator) : this.molecule + "/" + this.denominator;
	}
	
}

分式工具类

/**
 * 分式工具类
 */
public class FractionUtil {
	
	/**
	 * 最大公约数方法
	 */
	public static int greatestCommonDivisor(int a, int b) {
		if (a > b) {
			return (a % b == 0) ? b : greatestCommonDivisor(b, a % b);
		}
		return (b % a == 0) ? a : greatestCommonDivisor(a, b % a);
	}
	
	/**
	 * 最小公倍数
	 */
	public static int leastCommonMultiple(int a, int b) {
		return a * b / greatestCommonDivisor(a, b);
	}
	
	/**
	 * 判断一个分式是否为负数
	 */
	public static boolean isMinus(FractionEntity fraction) {
		return fraction.getMolecule() * fraction.getDenominator() < 0;
	}
	
	/**
	 * 分式除法
	 */
	public static FractionEntity division(FractionEntity a, FractionEntity b) {
		// 如果分式为0,则直接返回0
		if (a.getMolecule() == 0 || b.getMolecule() == 0) {
			return new FractionEntity(0, 1);
		}
		// 计算结果
		FractionEntity result = new FractionEntity();
		// 计算
		result.setMolecule(a.getMolecule() * b.getDenominator());
		result.setDenominator(a.getDenominator() * b.getMolecule());
		// 求最大公约数
		int factor = greatestCommonDivisor(Math.abs(result.getMolecule()), Math.abs(result.getDenominator()));
		// 约分
		result.setDenominator(result.getDenominator() / factor);
		result.setMolecule(result.getMolecule() / factor);
		// 返回结果
		return result;
	}
	
	/**
	 * 分式乘法
	 */
	public static FractionEntity multiplication(FractionEntity a, FractionEntity b) {
		// 如果分式为0,则直接返回0
		if (a.getMolecule() == 0 || b.getMolecule() == 0) {
			return new FractionEntity(0, 1);
		}
		// 计算结果
		FractionEntity result = new FractionEntity();
		// 计算
		result.setMolecule(a.getMolecule() * b.getMolecule());
		result.setDenominator(a.getDenominator() * b.getDenominator());
		// 求最大公约数
		int factor = greatestCommonDivisor(Math.abs(result.getMolecule()), Math.abs(result.getDenominator()));
		// 约分
		result.setDenominator(result.getDenominator() / factor);
		result.setMolecule(result.getMolecule() / factor);
		// 返回结果
		return result;
	}
	
	/**
	 * 分式减法
	 */
	public static FractionEntity subtraction(FractionEntity a, FractionEntity b) {
		// 分式减法这儿要分别考虑被减数和减数为0的情况
		if (a.getMolecule() == 0 && b.getMolecule() != 0) {
			b.setMolecule(-1 * b.getMolecule());
			return b;
		} else if (a.getMolecule() != 0 && b.getMolecule() == 0) {
			return a;
		} else if (a.getMolecule() == 0 && b.getMolecule() == 0) {
			return a;
		}
		// 计算结果
		FractionEntity result = new FractionEntity();
		// 通分并计算
		// 两个分数的分母的最小公倍数
		int multiple = leastCommonMultiple(a.getDenominator(), b.getDenominator());
		int temp1 = multiple / a.getDenominator();
		int temp2 = multiple / b.getDenominator();
		// 分子相减
		result.setMolecule(a.getMolecule() * temp1 - b.getMolecule() * temp2);
		// 分母不变
		result.setDenominator(multiple);
		// 约分
		// 不考虑符号
		int factor = greatestCommonDivisor(Math.abs(result.getMolecule()), Math.abs(result.getDenominator()));
		result.setDenominator(result.getDenominator() / factor);
		result.setMolecule(result.getMolecule() / factor);
		// 返回结果
		return result;
	}
	
}

多项式除法主类

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 多项式除法
 */
public class PolynomialDivision {
	
	/**
	 * 这里采用链表+单项式实体类表示多项式<br/>
	 * 可以使用二维数组,但二维数组较为抽象不易理解
	 */
	public static void main(String[] args) throws Exception {
		
		// 保存被除多项式
		List<PolynomialEntity> polynomial01 = new ArrayList<>();
		// 保存除以的多项式
		List<PolynomialEntity> polynomial02 = new ArrayList<>();
		// 从控制台输入多项式
		Scanner scanner = new Scanner(System.in);
		int index = 0;
		System.out.println(">>>>>>>>>>>>>>>请输入被除多项式(多项式中不要出现多个相同幂的单项式,且多项式按最高次幂依次输入,且只支持整数幂情况)<<<<<<<<<<<<<<<");
		InputPolynomial(polynomial01, scanner, index);
		System.out.println(">>>>>>>>>>>>>>>请输入除以的多项式(多项式中不要出现多个相同幂的单项式,且多项式按最高次幂依次输入,且只支持整数幂情况)<<<<<<<<<<<<<<<");
		InputPolynomial(polynomial02, scanner, index);
		// 执行多项式除法并打印竖式
		// polynomials保存多项式除法中的余式多项式
		List<List<PolynomialEntity>> polynomials = new ArrayList<>();
		// polynomials0保存多项式除法中的中间多项式,即每次除法是跟被除式子做减法的那个多项式
		List<List<PolynomialEntity>> polynomials0 = new ArrayList<>();
		// merchant保存多项式除法的商
		List<PolynomialEntity> merchant = new ArrayList<>();
		// remainder保存多项式除法的余数,也是递归调用中下一次被除多项式
		List<PolynomialEntity> remainder = new ArrayList<>();
		div(polynomial01, polynomial02, polynomials, merchant, remainder, polynomials0);
		System.out.println(">>>>>>>>>>>>>>>最终计算结果<<<<<<<<<<<<<<<");
		OutputPolynomial(polynomial01);
		System.out.print(" / ");
		OutputPolynomial(polynomial02);
		System.out.print(" = ");
		OutputPolynomial(merchant);
		System.out.print("...");
		OutputPolynomial(remainder);
	}
	
	/**
	 * 打印多项式
	 */
	private static void OutputPolynomial(List<PolynomialEntity> polynomial) {
		for (int i = 0; i < polynomial.size(); i++) {
			// 非0单项式
			if (polynomial.get(i).getCoefficient().getMolecule() != 0) {
				// 第一项
				if (i == 0) {
					System.out.print(polynomial.get(i));
				} else {
					// 如果系数为负数
					if (FractionUtil.isMinus(polynomial.get(i).getCoefficient())) {
						System.out.print(polynomial.get(i));
					} else {
						System.out.print("+" + polynomial.get(i));
					}
				}
			}
		}
	}
	
	/**
	 * 多项式除法
	 *
	 * @param polynomial01 被除多项式
	 * @param polynomial02 除以的多项式
	 * @param polynomials  多项式除法中的余式多项式
	 * @param merchant     商
	 * @param remainder    余数,也是递归调用中下一次被除多项式
	 * @param polynomials0 多项式除法中的中间多项式,即每次除法是跟被除式子做减法的那个多项式
	 */
	private static void div(List<PolynomialEntity> polynomial01, List<PolynomialEntity> polynomial02,
							List<List<PolynomialEntity>> polynomials, List<PolynomialEntity> merchant,
							List<PolynomialEntity> remainder, List<List<PolynomialEntity>> polynomials0) throws Exception {
		// 清空余数,因为上次计算过重充当了临时变量
		remainder.clear();
		// 通过递归依次消除被除多项式单项式(从最 高次幂-首个单项式 开始)
		PolynomialEntity firstItem = polynomial01.get(0);
		// 获得本次计算中商的单项式的最高次幂和系数并加入到最终商中
		// 计算系数
		FractionEntity coefficient = FractionUtil.division(firstItem.getCoefficient(), polynomial02.get(0).getCoefficient());
		// 计算幂
		int power = firstItem.getPower() - polynomial02.get(0).getPower();
		// 将计算出的单项式加入到最终商中
		PolynomialEntity temp = new PolynomialEntity(coefficient, power);
		merchant.add(temp);
		// 计算本次计算过程的中间多项式
		List<PolynomialEntity> entity = new ArrayList<>();
		for (PolynomialEntity polynomialEntity : polynomial02) {
			entity.add(new PolynomialEntity(FractionUtil.multiplication(polynomialEntity.getCoefficient(), temp.getCoefficient()), temp.getPower() + polynomialEntity.getPower()));
		}
		// 中间多项式补零
		fillZeroItem(entity);
		// 添加中间多项式
		polynomials0.add(entity);
		// 计算多项式除法中的余式多项式,也是递归调用中下一次被除多项式
		// 从被除多项式的第二项开始做分式减法,因为每次中间计算时总是消掉被除多项式的最高次幂项
		for (int i = 1; i < polynomial01.size(); i++) {
			remainder.add(new PolynomialEntity(FractionUtil.subtraction(polynomial01.get(i).getCoefficient(), entity.get(i).getCoefficient()), polynomial01.get(i).getPower()));
		}
		// 余式多项式补零
		fillZeroItem(remainder);
		// 保存本次计算中的余数
		polynomials.add(remainder);
		if (!remainder.isEmpty() && remainder.get(0).getPower() >= polynomial02.get(0).getPower()) {
			List<PolynomialEntity> list = new ArrayList<>(remainder);
			div(list, polynomial02, polynomials, merchant, remainder, polynomials0);
		}
	}
	
	/**
	 * 输入多项式 - 注意本方法不处理多项式出现多个相同次幂的单项式情况<br/>
	 * 同时,假设输入的多项式均为按最高次幂降序输入(即此处不进行排序)
	 *
	 * @param polynomial 代表一个多项式
	 * @param scanner    输入流
	 * @param index      代表多项式中的第 index 个单项式
	 */
	private static void InputPolynomial(List<PolynomialEntity> polynomial, Scanner scanner, int index) throws Exception {
		do {
			PolynomialEntity polynomialEntity = new PolynomialEntity();
			System.out.print("请输入多项式第 " + index + 1 + " 项(从左往右)的系数(分数格式-a/b,整数直切输入):");
			String coefficient = scanner.next();
			FractionEntity fraction = new FractionEntity();
			if (coefficient.contains("/")) { // 系数为分数
				// 设置分子
				fraction.setMolecule(Integer.parseInt(coefficient.split("/")[0]));
				// 设置分母
				fraction.setDenominator(Integer.parseInt(coefficient.split("/")[1]));
			} else { // 系数为整数
				// 设置分子
				fraction.setMolecule(Integer.parseInt(coefficient));
				// 设置分母
				fraction.setDenominator(1);
			}
			polynomialEntity.setCoefficient(fraction);
			System.out.print("请输入多项式第 " + index + 1 + " 项(从左往右)的幂:");
			polynomialEntity.setPower(scanner.nextInt());
			// 添加本次输入的单项式
			polynomial.add(polynomialEntity);
			System.out.print("是否结束输入(y / n):");
			index++;
		} while (!scanner.next().equals("y"));
		// 前后输入的多项式幂不连续则补零
		fillZeroItem(polynomial);
	}
	
	/**
	 * 针对输入的多项式,若幂不连续(如存在0x^2或没有常数项,将其补齐)<br/>
	 * 注意:本方法默认假设多项式按最高次幂降序排序,且不存在相同幂的项
	 */
	public static void fillZeroItem(List<PolynomialEntity> polynomial) throws Exception {
		if (polynomial.isEmpty()) {
			throw new Exception("需要补零的多项式不能为空!");
		}
		Object[][] arr = new Object[2][polynomial.get(0).getPower() + 1];
		
		polynomial.forEach(PolynomialEntity -> {
			arr[0][PolynomialEntity.getPower()] = PolynomialEntity.getPower();
			arr[1][PolynomialEntity.getPower()] = PolynomialEntity.getCoefficient();
		});
		polynomial.clear();
		for (int i = arr[0].length - 1; i >= 0; i--) {
			if (arr[0][i] != null) {
				polynomial.add(new PolynomialEntity((FractionEntity) arr[1][i], (Integer) arr[0][i]));
			} else {
				polynomial.add(new PolynomialEntity(new FractionEntity(0, 1), i));
			}
		}
	}
	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值