PAT A1002

本文介绍了一种基于结构体的多项式加法算法实现方案。通过定义结构体存储多项式的指数和系数,并通过比较两个多项式的低幂项来逐步构建和多项式。特别注意当两个多项式的某项系数互为相反数时,该项系数和为0,不会出现在最终的和多项式中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路:

1、构造结构体poly,包含两个成员(指数和系数),将输入的两个多项式分别保存到两个poly数组;

2、比较两个多项式的低幂项,将指数较低的 指数和系数 作为和多项式的 指数和系数,若指数相同,则将系数和作为和多项式的系数(注意此处有一坑点,若两个多项式系数刚好为相反数,则和多项式系数为0);

3、按格式输出和多项式。

AC代码如下

#include <iostream>
using namespace std;

int main(){
	//Ni为指数,aNi为系数 
	typedef struct poly{
		int Ni; 
		double aNi;
	} poly; 
	
	poly poly1[15]={0},poly2[15]={0},poly3[30]={0};
	int k1=0,k2=0,k3=0;
	
	scanf("%d",&k1);
	for(int i = 1;i<=k1;i++){
		scanf("%d%lf",&poly1[i].Ni,&poly1[i].aNi);
	}
	scanf("%d",&k2);
	for(int i = 1;i<=k2;i++){
		scanf("%d%lf",&poly2[i].Ni,&poly2[i].aNi);
	}
	
	while(k1&&k2){
		//指数相等,和的指数等于1式指数,和的系数等于1式2式的系数和 
		if(poly1[k1].Ni==poly2[k2].Ni){
			//注意若两个多项式系数刚好为相反数时,和会减少一项 
			if(poly1[k1].aNi+poly2[k2].aNi!=0){
				poly3[k3].Ni=poly1[k1].Ni;
				poly3[k3].aNi=poly1[k1].aNi+poly2[k2].aNi;
				k3++;
			}
			k1--;k2--;
		}
		//将指数低的项存入和多项式 数组 
		else if(poly1[k1].Ni<poly2[k2].Ni){
			poly3[k3].Ni=poly1[k1].Ni;
			poly3[k3].aNi=poly1[k1].aNi;
			k1--;k3++;
		}
		else{
			poly3[k3].Ni=poly2[k2].Ni;
			poly3[k3].aNi=poly2[k2].aNi;
			k2--;k3++;
		}
	}
	//将剩余项存入和多项式数组 
	while(k1){
		poly3[k3].Ni=poly1[k1].Ni;
		poly3[k3].aNi=poly1[k1].aNi;
		k1--;k3++;
	}
	while(k2){
		poly3[k3].Ni=poly2[k2].Ni;
		poly3[k3].aNi=poly2[k2].aNi;
		k2--;k3++;
	}
	//输出和多项式 
	printf("%d",k3);
	while(k3){
		printf(" %d %0.1f",poly3[k3-1].Ni,poly3[k3-1].aNi);
		k3--;
	}
}


用C++写的实现了基本的功能 #include<iostream> #include"PolyList.h" using namespace std; Polynomial::Polynomial() { coefs = NULL; exps = NULL; size = 0; cout<<"构造完成"<<endl; } Polynomial::~Polynomial() { delete []coefs; delete []exps; coefx = NULL; expx= NULL; cout<<"析构调用"<<endl; } Polynomial::Polynomial(double coef[],int exp[],int s) { coefs = new double[s]; exps = new int[s]; size = s; for(int i = 0; i<size; i++) coefs[i] = coef[i]; for(i = 0;i<size;i++) exps[i] = exp[i]; cout<<"complete!"<<endl; } Polynomial::Polynomial(const Polynomial &p) { coefs = new double[p.size]; exps = new int[p.size]; size = p.size; for(int i = 0;i < size; i++) coefs[i]= p.coefs; for(i = 0; i < size; i++) exps[i] = p.exps[i]; cout<<"copy调用"<<endl; } const Polynomial& Polynomial::operator=(const Polynomial &p)//完成测试 { if(this!=&p) { delete []coefs; delete []exps; size = p.size; coefs = new double[size]; exps = new int[size]; for(int i = 0;i < size;i++) coefs[i] = p.coefs[i]; for(int i = 0; i<size;i++) exps[i]=p.exps[i]; } return *this; }//完成测试 int Polynomial::degree() const //完成测试 { return size - 1; } double Polynomial::evaluate(double x) const//完成测试 { double sum=coefs[0]; for(int i = 1;i < size;i ++) { for(int j = 1;j <= i;j++) x*= x; sum+=coefs[i] * x; } return sum; } bool Polynomial::operator ==(const Polynomial &p) const { if (size != p.size) return false; return false; for(int i = 0; i < size; i++) if(coefs[i]!= p.coefs[i]) return false; return true; } bool Polynomial::operator !=(const Polynomial &p) const { return !(operator==(p)); } Polynomial Polynomial::operator +(const Polynomial &p) const { int maxsize = (size > p.size) ? size:p.size; int minsize = (size < p.size) ? size:p.size; Polynomial temp; temp.coefs = new double[maxsize]; temp.exps = new int [maxsize]; for(int i = 0;i < minsize;i ++) temp.coefs[i]=coefs[i] + p.coefs[i] for(;i < maxsize;i++) temp.coefs[i]=coefs[i]; for(int j = 0;j < maxsize;j++) temp.exps[j] = j; temp.size=maxsize; return temp; } Polynomial Polynomial::operator -(const Polynomial &p) const { int maxsize = (size > p.size) ? size:p.size; int minsize = (size < p.size) ? size:p.size; Polynomial temp; temp.coefs = new double[maxsize]; temp.exps = new int[maxsize]; for(int i = 0;i < minsize;i++) temp.coefs[i]=coefs[i] - p.coefs[i]; for(;i <maxsize;i++) temp.coefs[i]=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值