#include <iostream>
#include <list>
#include <vector>
using namespace std;
struct term {
int expn;
int coef;
};
void input(list <term>* A, int a)
{
term t;
for (int j = 0; j < a; j++)
{
cin >> t.coef >> t.expn;
(*A).push_back(t);
}
}
void Multiply(list <term> A, list <term> B)
{
if (A.empty() || B.empty())
cout << "0 0";
else {
list <term>::iterator p = A.begin();
list <term>::iterator q = B.begin();
list <term> ans;
int arr[2004] = { 0 };
term t;
for (; p != A.end(); p++)
{
for (q = B.begin(); q != B.end(); q++)
{
t.coef = ((*p).coef * (*q).coef);
t.expn = ((*p).expn + (*q).expn);
arr[t.expn] += t.coef;
}
}
int counter = 0;
for (int i = 2003; i >=0; i--)
{
if (arr[i])
{
if (counter)
cout << " ";
cout << arr[i] << " " << i;
counter++;
}
}
}
}
void Add(list <term> A, list <term>B)
{
if (B.empty())
;
else if (A.empty())
A = B;
else if (!A.empty() && !B.empty())
{
list <term>::iterator t = A.begin();
list <term>::iterator p = A.begin();
list <term>::iterator q = B.begin();
for (; q!=B.end();)//A是主链,A到不到end无所谓,B到end很有所谓
{//B到end才能说加法结束了
if (p != A.end() && (*p).expn == (*q).expn )
{
(*p).coef += (*q).coef;
if ((*p).coef==0)
{
A.erase(p++);
}
else {
p++;
}
q++;
}
else if (p != A.end() && (*p).expn > (*q).expn)
{
p++;
}
else if (p != A.end() && (*p).expn < (*q).expn ) {
t = p;
if (t != A.begin())
A.insert(--t, *q);
else
A.insert(A.begin(), *q);
q++;
}
else if(p==A.end()) {
A.push_back(*q);
}
}
}
if (A.empty()) cout << "0 0";
else {
int counter = 0;
for (list <term>::iterator p = A.begin(); p != A.end(); p++)
{
if (counter)
cout << " ";
cout << (*p).coef << " " << (*p).expn;
counter++;
}
}
}
int main() {
list <term> A;
list <term> B;
int a;
cin >> a;
input(&A, a);
cin >> a;
input(&B, a);
Multiply(A, B);
cout << endl;
Add(A, B);
}
千万注意iterator的位置,他跟指针还是不一样的,比如说p=t;指针里t++对p是没有影响的,但是迭代器里有影响,你对t++相当于对p也++,所以要注意这点。
并且iterator没有NULL一说,对于空list,iterator应该是野指针的感觉?
总之,iterator跟指针还是有很大差别的。这题思路挺简单,但是在实现上遇到了跟预期各种不符的东西。。。以及为了通过测试点才想起empty的情况。。。
加油,写的很烂,但是加油