• 数据结构.多项式加法


    1. #include
    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
    2. #include
    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. }

  • 相关阅读:
    Azide-SS-biotin|CAS:1620523-64-9|生物素-二硫键-叠氮可降解 (cleavable) 的 ADC linke
    Android多版本flavor配置之资源文件和清单文件合并介绍
    docker系列-报错以及解决指南
    使用del语句删除名称对引用计数的影响
    微信小程序和H5之间互相跳转、互相传值
    【JavaWeb】Servlet系列——session会话机制
    协同过滤算法
    国赛2022年最新思路汇总(信息速递)
    嵌入式Linux下运行 DotNet 应用简单示例
    SAP Table function 执行报错 code CX_SQL_EXCEPTION feature not supported 该如何分析
  • 原文地址:https://blog.csdn.net/2301_79724443/article/details/136413807