当前位置:   article > 正文

02-线性结构2 一元多项式的乘法与加法运算 (java)_pa!=null?pa:pb

pa!=null?pa:pb

02-线性结构2 一元多项式的乘法与加法运算 (20 分)

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

  1. 4 3 4 -5 2 6 1 -2 0
  2. 3 5 20 -7 4 3 1

输出样例:

  1. 15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
  2. 5 20 -4 4 -5 2 9 1 -2 0

 思路:

1.使用单链表,设置结点Node,成员变量为系数和指数以及下一个指向的对象

2.先来说一下多项式加法(比较简单)

   1)若指数相同则系数相加,添加到链表c中(不要忘记特判系数相加为0的情况这时候不相加)

   2)因为要有序,所以比较指数时,若该a链表当前结点的指数比b链表当前结点的指数大时,则把a链表当前结点添加到链表c中,然后让a链表当前结点往后移,链表c当前位置也往后移,同理链表b当前结点比链表a当前结点指数大的时候是一样的道理

   3)把剩余的结点加入到链表c中(pc.next=(pa!=null?pa:pb))

3.多项式乘法(可能我写的比较麻烦了)

    1)先将多项式a的第一项与多项式b的每一项相乘,把每一项都添加到新建的链表c中

    2)将多项式a余下的项与多项式b进行相乘,把相乘的项与链表c中每一项进行比较,若该项的指数与链表c中某一项的指数相同,则进行系数相加(这里需要特判,如果系数相加为0则去掉链表c中的该项),若该项系数要大于链表c中的某一项,则添加进去,若该项系数比链表c每一项的系数都要小的话,则添加到链表c的末位

其中需要特别注意的是:

当特判如果系数相加为0则去掉链表c中的该项时,若该项是链表c中的尾结点,去掉该尾结点之后会让当前结点的指向下一结点为空,程序认为是该项系数比链表c每一项系数都要小,会添加到链表c的末位,这个BUG我找了好久,哭叽叽,所以只需要添加一个布尔类型的变量来进行判断就行,初始值设为true,若是合并后下一结点为空,则把该变量设为false就行

  1. if(curPc.next==null && is) {
  2. curPc.next = new Node(xs, zs);
  3. }

4. 实现了多项式的乘法与加法计算后别以为就完事了,输出的时候还需要判别一下零多项式,若系数全是0的话就输出0 0就行

下面是AcCode:

  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner in = new Scanner(System.in);
  5. int lengthA = in.nextInt();
  6. int[][] numA = new int[lengthA][2];
  7. for (int i = 0; i < numA.length; i++) {
  8. for (int j = 0; j < numA[i].length; j++) {
  9. numA[i][j] = in.nextInt();
  10. }
  11. }
  12. LinkList linkListA = new LinkList(numA);
  13. int lengthB = in.nextInt();
  14. int[][] numB = new int[lengthB][2];
  15. for (int i = 0; i < numB.length; i++) {
  16. for (int j = 0; j < numB[i].length; j++) {
  17. numB[i][j] = in.nextInt();
  18. }
  19. }
  20. LinkList linkListB = new LinkList(numB);
  21. Node mutiply = linkListA.hbMutiplly(linkListA, linkListB);
  22. Node sum = linkListA.hbSum(linkListA, linkListB);
  23. mutiply = mutiply.next;
  24. boolean is = true;//是不是第一个元素
  25. boolean isZero = true;
  26. while(mutiply!=null) {
  27. if(is) {
  28. if(mutiply.xs!=0) {
  29. System.out.print(mutiply.xs+" "+mutiply.zs);
  30. is = false;
  31. isZero = false;
  32. }
  33. }else {
  34. if(mutiply.xs!=0) {
  35. System.out.print(" "+mutiply.xs+" "+mutiply.zs);
  36. isZero = false;
  37. }
  38. }
  39. mutiply = mutiply.next;
  40. }
  41. if(isZero) {
  42. System.out.print(0+" "+0);
  43. }
  44. System.out.println();
  45. is = true;
  46. isZero = true;
  47. sum = sum.next;
  48. while(sum!=null) {
  49. if(is) {
  50. if(sum.xs!=0) {
  51. System.out.print(sum.xs+" "+sum.zs);
  52. is = false;
  53. isZero = false;
  54. }
  55. }else {
  56. if(sum.xs!=0) {
  57. System.out.print(" "+sum.xs+" "+sum.zs);
  58. isZero = false;
  59. }
  60. }
  61. sum = sum.next;
  62. }
  63. if(isZero) {
  64. System.out.print("0 0");
  65. }
  66. System.out.println();
  67. }
  68. }
  69. class LinkList {
  70. Node head;// 头结点
  71. /**
  72. * 多项式乘积
  73. * @param linkListA
  74. * @param linkListB
  75. * @return
  76. */
  77. public Node hbMutiplly(LinkList linkListA,LinkList linkListB) {
  78. Node pa = linkListA.head.next;
  79. Node pb = linkListB.head.next;
  80. Node pc = new Node();
  81. Node curPc = pc;
  82. //初始化
  83. if(pa!=null) {
  84. while(pb!=null) {
  85. curPc.next = new Node(pa.xs*pb.xs, pa.zs+pb.zs);
  86. curPc = curPc.next;
  87. pb = pb.next;
  88. }
  89. pa = pa.next;
  90. }
  91. while(pa!=null) {
  92. pb = linkListB.head.next;
  93. curPc = pc;
  94. while(pb!=null) {
  95. int xs = pa.xs*pb.xs;
  96. int zs = pa.zs+pb.zs;
  97. boolean is = true;
  98. while(curPc.next!=null) {
  99. if(curPc.next.zs==zs) {
  100. if((curPc.next.xs+xs)!=0) {
  101. curPc.next.xs = curPc.next.xs+xs;
  102. }else {
  103. curPc.next = curPc.next.next;
  104. is = false;
  105. }
  106. break;
  107. }else if(curPc.next.zs<zs) {
  108. curPc.next = new Node(xs, zs, curPc.next);
  109. break;
  110. }
  111. curPc = curPc.next;
  112. }
  113. if(curPc.next==null && is) {
  114. curPc.next = new Node(xs, zs);
  115. }
  116. // Node c = pc.next;
  117. // while (c!= null) {
  118. // System.out.print(c.xs + " " + c.zs + " ");
  119. // c = c.next;
  120. // }
  121. // System.out.println();
  122. pb = pb.next;
  123. }
  124. pa = pa.next;
  125. }
  126. return pc;
  127. }
  128. /**
  129. * 多项式加法
  130. * @param linkListA
  131. * @param linkListB
  132. * @return
  133. */
  134. public Node hbSum(LinkList linkListA, LinkList linkListB) {
  135. Node pa = linkListA.head.next;
  136. Node pb = linkListB.head.next;
  137. Node NodeCHead = new Node();// 存放多项式的和
  138. Node pc = NodeCHead;
  139. while (pa != null && pb != null) {
  140. if (pa.zs == pb.zs) {
  141. if ((pa.xs + pb.xs) != 0) {
  142. pc.next = new Node(pa.xs + pb.xs, pa.zs);
  143. pc = pc.next;
  144. }
  145. pa = pa.next;
  146. pb = pb.next;
  147. } else if (pa.zs > pb.zs) {
  148. pc.next = pa;
  149. pc = pc.next;
  150. pa = pa.next;
  151. } else {
  152. pc.next = pb;
  153. pc = pc.next;
  154. pb = pb.next;
  155. }
  156. }
  157. pc.next = (pa != null) ? pa : pb;
  158. return NodeCHead;
  159. }
  160. public void display() {
  161. Node p = head.next;
  162. while (p != null) {
  163. System.out.print(p.xs + " " + p.zs + " ");
  164. p = p.next;
  165. }
  166. System.out.println();
  167. }
  168. public LinkList() {
  169. this.head = new Node();
  170. }
  171. public LinkList(int[][] num) {
  172. this();
  173. Node p = head;
  174. for (int i = 0; i < num.length; i++) {
  175. p.next = new Node(num[i][0],num[i][1], p.next);
  176. p = p.next;
  177. }
  178. }
  179. }
  180. class Node {
  181. int xs;
  182. int zs;
  183. Node next;
  184. /**
  185. * 初始化头结点
  186. */
  187. public Node() {
  188. this.next = null;
  189. }
  190. public Node(int xs, int zs, Node next) {
  191. this(xs, zs);
  192. this.next = next;
  193. }
  194. /**
  195. * 尾结点
  196. *
  197. * @param xs
  198. * @param zs
  199. */
  200. public Node(int xs, int zs) {
  201. this();
  202. this.xs = xs;
  203. this.zs = zs;
  204. }
  205. }

最后偷偷附上测试数据:

序号输入输出
14 3 4 -5 2 6 1 -2 0 
3 5 20 -7 4 3 1
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1 
5 20 -4 4 -5 2 9 1 -2 0
22 1 2 1 0
2 1 2 -1 0
1 4 -1 0
2 2
32 -1000 1000 1000 0
2 1000 1000 -1000 0
-1000000 2000 2000000 1000 -1000000 0
0 0
40
1 999 1000
0 0
999 1000

新人初学数据结构QAQ,不足跪求神犇指点

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/342815
推荐阅读
相关标签
  

闽ICP备14008679号