当前位置:   article > 正文

数据结构.多项式加法

数据结构.多项式加法

  1. #include<iostream>
  2. using namespace std;
  3. int a[100][2], b[100][2], sum[100][2];
  4. int n, m;
  5. int main()
  6. {
  7. cin >> n;//输入第一个多项式的项数
  8. for (int i = 0; i < n; i++)
  9. {
  10. cin >> a[i][0] >> a[i][1];//分别输入系数和指数
  11. }
  12. cin >> m;//输入第二个多项式的项数
  13. for (int i = 0; i < m; i++)
  14. {
  15. cin >> b[i][0] >> b[i][1];//分别输入系数和指数
  16. }
  17. int x = 0, y = 0, s = 0;//定位a,b,sum数组的下标指向
  18. while (x < n && y < m)//当x,y在项数数量范围内,则比较两个多项式的大小
  19. {
  20. if (a[x][1] == b[y][1])//如果二者的指数相同
  21. {
  22. sum[s][0] = a[x][0] + b[y][0];//则系数相加
  23. if (sum[s][0] != 0)//如果系数不等于0
  24. {
  25. sum[s][1] = a[x][1];//则指数落系下来
  26. s++;//指针往后移动
  27. }
  28. x++, y++;//指针往后移动
  29. }
  30. else if (a[x][1] > b[y][1])//如果a多项式的指数比b的多项式的指数大
  31. {
  32. sum[s][0] = a[x][0];//则将a的系数和指数都落到sum中
  33. sum[s][1] = a[x][1];
  34. s++, x++;//a和sum的指针往后移动
  35. }
  36. else//如果b的多项式的指数比a的多项式的指数大
  37. {
  38. sum[s][0] = b[y][0];//则将b的系数和指数都落到sum中
  39. sum[s][1] = b[y][1];
  40. s++, y++;//b和sum的指针往后移动
  41. }
  42. }
  43. if (x == n && y < m)//如果a没有项数可以比较
  44. {
  45. for (int i = y; i < m; i++)//则将b剩余的项的系数和指数都落下来
  46. {
  47. sum[s][0] = b[i][0];
  48. sum[s][1] = b[i][1];
  49. s++;
  50. }
  51. }
  52. if (y == m && x < n)//如果b没有项数可以比较
  53. {
  54. for (int i = x; i < n; i++)//则将a剩余的项的系数和指数都落下来
  55. {
  56. sum[s][0] = a[i][0];
  57. sum[s][1] = a[i][1];
  58. s++;
  59. }
  60. }
  61. for (int i = 0; i < s; i++)
  62. {
  63. if (i == 0)
  64. {
  65. cout << sum[i][0] << " " << sum[i][1];
  66. }
  67. else
  68. {
  69. cout << " " << sum[i][0] << " " << sum[i][1];
  70. }
  71. }
  72. if (s == 0)
  73. {
  74. cout << 0 << " " << 0;
  75. }
  76. return 0;
  77. }
  1. #include<iostream>
  2. #include<malloc.h>
  3. using namespace std;
  4. typedef struct node {
  5. int coef;//系数
  6. int exp;//指数
  7. node* next;//在c++中支持node*这种写法
  8. }list;
  9. node* newNode(int c, int e)//创建一个新结点
  10. {
  11. node* temp = (node*)malloc(sizeof(node));
  12. temp->coef = c;//系数
  13. temp->exp = e;//指数
  14. temp->next = NULL;
  15. return temp;
  16. }
  17. list* createPoly(int n)//创建长度为n的链表
  18. {
  19. list* L = NULL;//创建一个指针表示链表
  20. if (n == 0)//如果链表的长度为0,则直接返回
  21. {
  22. return L;
  23. }
  24. else
  25. {
  26. L = (list*)malloc(sizeof(node));//如果链表的长度不是0,则分配空间
  27. }
  28. int ac = 0;//初始化系数
  29. int ae = 0;//初始化指数
  30. node* lastp = L;//创建尾指针
  31. node* temp = NULL;//创建一个指针用来接收新插入的结点
  32. for (int i = 0; i < n; i++)
  33. {
  34. cin >> ac >> ae;//输入系数,指数
  35. temp = newNode(ac,ae);//接收这个新的结点
  36. lastp->next = temp;//尾插入新的结点
  37. lastp = temp;//更新尾结点
  38. }
  39. return L;//返回这条链表
  40. }
  41. list* addPoly(list* A, list* B)//将两个多项式相加
  42. {
  43. if (!A->next)return B;
  44. if (!B->next)return A;
  45. node* pa = A->next;//pa指向A的第一项
  46. node* pb = B->next;//pb指向B的第一项
  47. list* sum = (list*)malloc(sizeof(node));//创建一个计算总和的链表
  48. sum->next = NULL;//初始化
  49. node* lastp = sum;//尾结点
  50. node* temp = NULL;//创建一个临时结点
  51. while (pa && pb)//如果满足二者的长度在多项式内
  52. {
  53. if (pa->exp == pb->exp)//并且这一项的指数相同
  54. {
  55. if (pa->coef + pb->coef != 0)//并且相加还不等于0
  56. {
  57. temp = newNode(pa->coef + pb->coef, pa->exp);//那么就得到这个系数相加后的结点
  58. lastp->next = temp;//尾插入总和链表
  59. lastp = temp;
  60. }
  61. pa = pa->next;//指针向后移动
  62. pb = pb->next;
  63. }
  64. else if (pa->exp > pb->exp)//如果pa的指数比pb的指数大
  65. {
  66. temp = newNode(pa->coef, pa->exp);//将pa落下来
  67. lastp->next = temp;//尾插
  68. lastp = temp;
  69. pa = pa->next;//移动
  70. }
  71. else//如果pa的指数比pb小,同理
  72. {
  73. temp = newNode(pb->coef, pb->exp);
  74. lastp->next = temp;
  75. lastp = temp;
  76. pb = pb->next;
  77. }
  78. }
  79. if (pa == NULL && pb != NULL)//如果pa指向空,将pb后面的全部落下来
  80. {
  81. lastp->next = pb;
  82. }
  83. if (pb == NULL && pa != NULL)//同理
  84. {
  85. lastp->next = pa;
  86. }
  87. return sum;
  88. }
  89. void printPoly(list*L)//打印链表
  90. {
  91. if (!L->next)//如果链表为空,则直接打印0 0
  92. {
  93. cout << "0 0";
  94. }
  95. else//如果链表不为空
  96. {
  97. node* p = L->next;//p指向第一个结点
  98. int i = 0;
  99. while (p)
  100. {
  101. if (i == 0)
  102. {
  103. cout << p->coef << " " << p->exp;
  104. i++;
  105. }
  106. else
  107. {
  108. cout << " " << p->coef << " " << p->exp;
  109. }
  110. p = p->next;
  111. }
  112. }
  113. }
  114. int main()
  115. {
  116. int n, m;
  117. cin >> n;
  118. list* La = createPoly(n);//创建A链表
  119. cin >> m;
  120. list* Lb = createPoly(m);//创建B链表
  121. list* result = addPoly(La, Lb);//计算
  122. printPoly(result);//打印
  123. return 0;
  124. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号