​​​​​​​

单项式实体类

例如:在中,代表一个 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;}@Overridepublic 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;}@Overridepublic 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,则直接返回0if (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,则直接返回0if (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));}}}}

多项式除法Java实现相关推荐

  1. java 代码实现除法_Java实现多项式除法的代码示例

    两个多项式相除,得到一个商多项式和余多项式. 这两个多项式项数分别为m和n,m>n,最高次数分别是m-1和-1.多项数相除,商多项式为R(x),余多项式为L(x);' 通过推算,可知商多项式的最 ...

  2. Java 多项式除法

    两个多项式相除,得到一个商多项式和余多项式. 例如:A(x) =am-1xm-1+ am-2xm-2+ am-3xm-3+...+a1x+a0: B(x) =bn-1xn-1+ bn-2xn-2+ b ...

  3. 多项式除法(Java实现)

    多项式除法(Java实现) 首先多项式可以用数组来表示,数组下标表示x的次数,值表示对应项的系数 多项式相除的结果包括商和余数 我们假设被除数为A,除数为B,商为R,余数为L 若被除数的最高次数为m, ...

  4. 【学习笔记】超简单的多项式除法(含完整证明)

    整理的算法模板合集: ACM模板 目录 多项式除法 P4512 [模板]多项式除法 tips 还没调出来的vector版本代码 点我看多项式全家桶(●^◡_◡◡​^●) 多项式除法 P4512 [模板 ...

  5. P4512 【模板】多项式除法

    题意:多项式除法,A(x)=C(x)*B(x)+D(x),给定A(x),B(x),求C(x),D(x) 题解:A(x)的度是n,B(x)的度是m 定义\(A'(x)=x^n*A(\frac{1}{x} ...

  6. deconv--反褶积和多项式除法

    [功能简介]求向量反褶积和进行多项式除法运算. [语法格式] [q,r]=deconv(v,u) 参数q和r分别返回多项式v除以多项式u的商多项式和余多项式. [实例3.33]求多项式(x2+2x+1 ...

  7. luogu P4512 多项式除法 (模板题、FFT、多项式求逆)

    luogu P4512 多项式除法 (模板题.FFT.多项式求逆) 手动博客搬家: 本文发表于20181206 14:42:53, 原地址https://blog.csdn.net/suncongbo ...

  8. 多项式除法,多项式取模

    多项式除法 给定一个nnn次多项式F(x)F(x)F(x)和mmm次多项式G(x)G(x)G(x),要求R(x),Q(x)R(x), Q(x)R(x),Q(x),满足F(x)=R(x)G(x)+Q(x ...

  9. 多项式算法7:多项式除法

    多项式算法7:多项式除法 多项式除法 前置知识: FFT NTT 多项式求逆 多项式除法 算法简述: 给定多项式FFF , GGG求出多项式RRR,QQQ使得F=G×Q+RF=G \times Q + ...

最新文章

  1. 【思维训练】刺激战场极寒模式下带妹吃鸡的【兵法思维】和【统计学思维】
  2. c#控制台应用程序,如何实现隐藏DOS窗口
  3. 云信小课堂丨视频“双录”知多少?
  4. DCMTK:读取DICOM图像,添加一个Curve并将其写回
  5. step4 . day1标准IO和文件IO
  6. 如何用ABP框架快速完成项目(2) - 快的定义!
  7. SAP CRM Long text unit test preparation
  8. git远程仓库上传及本地仓库创建
  9. VC++ MsChart控件怎么用?
  10. 归并排序时间复杂度分析
  11. C#ObjectArx Cad添加图层
  12. virtualbox硬件加速_虚拟机安装后必做的3项设置,解决运行卡慢问题,提速十倍!...
  13. 1538G. Gift Set
  14. B树与B+树简明扼要的区别
  15. 谏太宗十思疏 魏征(原文/译文)
  16. 初始化Weex项目遇到的问题记录
  17. 数加平台在数据挖掘项目中的实践
  18. Radon定理与证明
  19. 2022出海拉美:秘鲁电商市场现状及发展前景
  20. java程序员的学习规划,附源代码

热门文章

  1. Python Learning Notes - 2
  2. Unity+SteamVR开发——交互
  3. 第十二次CCF计算机软件能力认证
  4. 普通人如何创业,怎么迈出第一步?看完你就明白了丨国仁网络资讯
  5. Linux虚拟机连接主机网络
  6. 一、Java基础(6)
  7. pyaudio usb playback_苹果还会为 iPhone 换上 USB-C 吗?_详细解读_最新资讯_热点事件...
  8. 《那些年啊,那些事——一个程序员的奋斗史》十二
  9. 数独求解算法_我如何回到一个老问题,终于写了一个数独求解算法
  10. [极客大挑战 2019]Secret File 1解题思路