【OJ】多项式加法

复习了一下STL,写完才想起来可以用map,代码量*3,orz

提交时遇到一次Presentation Error,OJ的空格输出实在是太随性。

思路是分别对两组输入进行排序,再通过k1,k2两个迭代器导入新的容器

注意:

  1. 容器为空时,begin()与end()返回相同
  2. 容器为空与容器不为空时,begin()返回不一致
  3. 需要进行操作的多项式中,存在0(即输入仅包含一个系数和一个负项数,如:9 -7)和多组相同幂数的情况(12 7 -7 5 3 17 23 4 15 10 -10 5 13 5 2 19 9 -7)

    vector<int> a, b;
    vector<int>::const_iterator k1, k2;
    if (a.begin() == a.end())    //输出1
        cout << ‘1‘;
    else
        cout << ‘0‘;
    if (a.begin() == b.begin())    //输出1
        cout << ‘1‘;
    else
        cout << ‘0‘;
    k1 = a.begin();
    a.push_back(5);
    k2 = a.begin();
    if (k1 == k2)    //输出0
        cout << ‘1‘;
    else
        cout << ‘0‘;

  1 #include <iostream>
  2 #include <algorithm>
  3 #include <vector>
  4 using namespace std;
  5 class poly{    //多项式类
  6 public:
  7     int coe;    //系数
  8     int item;    //项数
  9     poly(){}
 10     poly(int a, int b): coe(a), item(b){}
 11     friend bool operator < (const poly &, const poly &);
 12     friend poly operator + (const poly &, const poly &);
 13 };
 14 bool operator < (const poly &a, const poly &b){
 15     if (a.item > b.item)
 16         return true;
 17     else
 18         return false;
 19 }
 20 poly operator + (const poly &a, const poly &b){
 21     return poly(a.coe + b.coe, a.item);
 22 }
 23 void insert_num(vector<poly> &x){
 24     poly tmp;
 25     int a, b;
 26     while (cin >> a >> b){
 27         if (b < 0)
 28                 break;
 29         tmp.coe = a;
 30         tmp.item = b;
 31         x.push_back(tmp);
 32     }
 33 }
 34 int main(){
 35     int n;
 36     vector<poly> p1, p2, p3;
 37     vector<poly>::iterator k1, k2, k3;
 38     cin >> n;
 39     for (int i = 0; i < n; ++i){
 40         insert_num(p1);
 41         insert_num(p2);
 42         sort(p1.begin(), p1.end());
 43         sort(p2.begin(), p2.end());
 44         k1 = p1.begin();
 45         k2 = p2.begin();
 46         while (1){
 47             k3 = p3.end() - 1;    //请勿使用p3.rbegin(),对应reverse_iterator
 48             if (k1 < p1.end() && k2 < p2.end()){
 49                 if ((*k1).item < (*k2).item){
 50                     if (!p3.empty() && (*k3).item == (*k2).item)
 51                         (*k3) = (*k3) + (*k2);
 52                     else
 53                         p3.push_back(*k2);
 54                     k2++;
 55                 }
 56                 else if ((*k1).item > (*k2).item){
 57                     if (!p3.empty() && (*k3).item == (*k1).item)
 58                         (*k3) = (*k3) + (*k1);
 59                     else
 60                         p3.push_back(*k1);
 61                     k1++;
 62                 }
 63                 else{
 64                     if (!p3.empty() && (*k3).item == (*k2).item)
 65                         (*k3) = (*k3) + (*k2) + (*k1);
 66                     else
 67                         p3.push_back((*k1) + (*k2));
 68                     k1++;
 69                     k2++;
 70                 }
 71             }
 72             else if (k1 < p1.end() && k2 == p2.end()){
 73                 while (k1 < p1.end()){
 74                     k3 = p3.end() - 1;
 75                     if (!p3.empty() && (*k3).item == (*k1).item)
 76                         (*k3) = (*k3) + (*k1);
 77                     else
 78                         p3.push_back(*k1);
 79                     k1++;
 80                 }
 81             }
 82             else if (k1 == p1.end() && k2 < p2.end()){
 83                 while (k2 < p2.end()){
 84                     k3 = p3.end() - 1;
 85                     if (!p3.empty() && (*k3).item == (*k2).item)
 86                         (*k3) = (*k3) + (*k2);
 87                     else
 88                         p3.push_back(*k2);
 89                     k2++;
 90                 }
 91             }
 92             else
 93                 break;
 94         }
 95         for (k3 = p3.begin(); k3 < p3.end(); k3++){
 96             if ((*k3).coe != 0)
 97                 cout << "[ " << (*k3).coe << ‘ ‘ << (*k3).item << " ] ";
 98         }
 99         cout << endl;
100         p1.clear();
101         p2.clear();
102         p3.clear();
103     }
104     return 0;
105 }

原文地址:https://www.cnblogs.com/victorique-de-blois/p/11581823.html

时间: 2024-10-21 19:47:45

【OJ】多项式加法的相关文章

算法练习--多项式加法

JS 实现 多项式加法 Array.prototype.existKey = function(propVal){ var i = 0; for(var i = 0;i < this.length; i++){ if(this[i].k == propVal){return i;} } return -1; } function polynAdd(a,b){ //1. parse out each exp var strA = a[0] == '-' ? a : '+' + a; var str

程序设计入门——C语言 第7周编程练习 1多项式加法(5分)

第7周编程练习 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 多项式加法(5分) 题目内容: 一个多项式可以表达为x的各次幂与系数乘积的和,比如: 2x6+3x5+12x3+6x+20 现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出. 程序要处理的幂最大为100. 输入格式:

[DataStructure]多项式加法与乘法--B.链表存储(适用于零元系数多的多项式)

数据结构大作业…… 发出来大家乐呵乐呵…… 一.问题描述 给出N个多项式,求他们的和与积 二.解题报告 基本思想:加法和乘法都是把得数项直接链接在链表后面,最后统一做一个Merge&Sort工作即可.方便又快捷. (1)建立存储结构 1 struct _Poly 2 { 3 int factor;//系数 4 int Index;//幂 5 struct _Poly* next;//下一节点 6 }; 7 _Poly* poly[MAXTIMES+1]; 8 int Sum[MAXTIMES+1

[DataStructure]多项式加法与乘法--A.数组存储(适用于零元系数少的多项式)

数据结构大作业…… 发出来大家乐呵乐呵…… 一.问题描述 给出N个多项式,求他们的和与积 二.解题报告 (1)建立存储结构 1 struct _Poly 2 { 3 double Data[MAXTIMES+1]; 4 int Times; 5 }; 6 struct _Poly Poly[N+1]; (2)主程序架构 1 int main() 2 { 3 int Sum; 4 cout<<"请输入要做运算的多项式数量"<<endl; 5 cin>>

多项式加法运算 使用链表实现

/* 多项式加法运算 使用链表实现 */ #include <iostream> using namespace std; //使用不带头结点的单向链表,按照指数递减的顺序排列 typedef struct PolyNode { int coef; //系数 int expon; //指数 PolyNode *link; //指向下一个节点的指针 }*polynomial, npolynomial; polynomial PolyAdd(polynomial p1, polynomial p2

一元稀疏多项式加法运算

描述: 设计一个一元稀疏多项式加法运算器,完成多项式a和b相加,建立多项式a+b. 输入说明: 一组输入数据,所有数据均为整数.第1行为2个正整数n,m,其中 n表示第一个多项式的项数,m表示第二个多项式的项数:第2行包含2n个整数,每两个整数分别表示第一个多项式每一项的系数和指数:第3行包含2m个整数,每两个整数分别表示第二个多项式每一项的系数和指数.(注:序列按指数升序排列) 输出说明: 在一行以类多项式形式输出结果,指数按从低到高的顺序.注意,系数值为1的非零次项的输出形式中略去系数1,如

南邮OJ 1005 多项式加法

题目描述:线性表是一种最简单.最基本,也是最常用的数据结构,其用途十分广泛,例如,用带表头结点的单链表求解一元整系数多项式加法和乘法运算.现给两个一元整系数多项式,请求解两者之和. 题目链接:点击打开链接 代码是借鉴别人的,链接:点击打开链接 <span style="font-size:18px;">#include <iostream> using namespace std; class nodeList; class Node //单链表节点 { pri

南邮OJ 1005 多项式加法(二)

一.首先,这个多项式是一个链表,多项式的每一项是链表一个节点,那么可以想到两种情况: 1)多项式只有一项或者是多项式的最后一项,那么这个节点就只需要有系数和指数两个元素,且不需要指向下 一个节点. 2)多项式的其中一项,那么这个节点就需要有系数.指数以及指向下一个节点的指针. <span style="font-size:18px;"><span style="font-size:18px;">class Node { private: in

数据结构之利用单向链表实现多项式加法和乘法

在<数据结构与算法分析--c语言描述>一书中,作者指出了使用单向链表作为实现多项式的方法.但是没有给出具体实现.下面自己对其进行实现.只考虑功能.对其他细节不暂时不考虑.程序完成两个功能,使用单向链表完成多项式的加法和乘法.首先看加法,解决加法问题的思想在于对表示进行操作的两个链表表示的多项式按照指数递减的结构排列,每个节点的数据域存储着多项式某一项的系数(Coefficient)和指数(Exponent),还有一个指向后继节点的指针.节点的实现如下: 1 typedef struct Nod