一、问题描述
一个多项式可以表示为一组数对,数对中第一个数始终为整数,且唯一,表示多项式的次数,另一数表示为对应的系数且不为0。输入两组数对,每组以0 0作为结束,实现对两个多项式的加法并按降幂输出结果数对
二、问题分析
每一个数对可以视为一个结构体,每个结构体由两个变量决定,相加的时候由数对的第一个元素决定,相同的时候相加,找不到匹配项的直接保存下来。最后应用sort的排序,最后的排序标准也是使用对第一个元素的比较。coe表示系数,exp表示次数。
三、算法分析
关键算法部分就是相加和排序,相加的核心语句就是
if (ivec1[j].coe==ivec2[i].coe)
每次用一号数组和二号数组进行比对,依次比较,有相同的就让指标变量递增,若遍历搜索完成之后指标变量仍然为0,则说明没有符合的叠加项,因此也要复制到输出数组中。
最后排序的核心算法采用algorithm的sort排序算法,布尔型指标变量是由结点第一个变量决定。关键步骤是
sort(ivec1.begin(), ivec1.end(), Compare);
compare的核心语句是
return a.coe>b.coe?1:0;
最后的输出用vector的常规顺序输出即可
四、详细设计(从算法到程序)
(一)头文件部分是要添加
vector和algorithm
头文件便于构建数组类和排序。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int num;
(二)结构体构建的是数组类的每个结点拥有元素分别代表多项式系数和多项式指数。
struct Node{
public:
int coe; //多项式系数
int exp; //多项式指数
};
(三)三个函数分别负责输入输出,相加还有排序的比较系数。
void Input(vector<Node> &ivec);
void Output(const vector<Node> & ivec);
void Add(vector <Node> & ivec1, const vector<Node> &ivec2);
bool Compare(const Node& a, const Node& b);
(四)主函数进行运算。
int main(){
vector<Node>ivec1, ivec2;
Input(ivec1);
Input(ivec2);
Add(ivec1, ivec2);
sort(ivec1.begin(), ivec1.end(), Compare);
Output(ivec1);
return 0;
}
(六)输出数组函数的定义
void Output(const vector<Node> & ivec){
int n=ivec.size();
for (int i=0;i<n-1;i++) cout<<ivec[i].coe<<" "<<ivec[i].exp<<endl;
cout<<ivec[n-1].coe<<" "<<ivec[n-1].exp;
}
(七)数组相加函数的定义,关键在这里的相加条件和返回最后结果的过程。采用指标变量,若指标变量从头到尾的搜索没有变化,说明没有需要相加的部分,也需要保存下来。
void Add(vector <Node> & ivec1, const vector<Node> &ivec2){
for (int i=0;i<ivec2.size();i++){
int t=0;
for (int j=0;j<ivec1.size();j++){
if (ivec1[j].coe==ivec2[i].coe){
ivec1[j].exp=ivec1[j].exp+ivec2[i].exp;
t++;
break;
}
}
if (t==0){
ivec1.push_back(ivec2[i]);
}
}
}
(八)返回sort函数中比较指标变量的函数
bool Compare(const Node& a, const Node& b){
return a.coe>b.coe?1:0;
}
五、分析与总结
这个题目思维偏简洁,过程略复杂。需要耐心和严谨,运用STL的sort函数可以大大缩减代码的长度。这要求我要熟悉stl的使用和简易链表还有数组类的构建。我觉得这题还可以用链表的第一个链表的倒序输入,第二个链表的插入输入做,但是不如vector简单方便。