这是一道关于多项式的计算题
(题目有点问题)
因为题目已经给出了要写哪些函数,我们一个一个地实现就OK了。
#include <iostream>
#include<stdlib.h>
#include<time.h>
#include<assert.h>
using namespace std;
int *getPolynomial(int num){//创建空间
int *p=new int[num+2];//new一个数组 少开辟了一个空间,所以一直报错!
*p={0};//初始化
*(p+num+1)=-1;//用于后续函数判断数组是否到结尾
return p;
}
void setPolyCoef(int *pt,int maxval){// 函数对多项式系数(pt 所指向的动态数组的元素)赋值,每个元素的值为在 0~ maxval-1 之间的随机数。
//srand((unsigned)time(NULL));//以秒作为种子,有点小问题
srand(clock());//精确到毫秒(题目限制了头文件,所以我只能想到这个办法)
int i=0;
while(*(pt+i)!=-1){//逐一赋值
*(pt+i)=(rand()%maxval);
i++;
}
//*(pt+i-1)=0;//用来debug的
}
void releaseMem(int *pt){//函数用于释放由 getPolynomial 所申请的内存空间。
delete []pt;
}
void printPolynomial(int *pt){// 函数按照多项式的格式,从左到右依次打印高次项,…, 常数项。 例如打印四次多项式: 5x^4 + 23x^3 + 105x + 2
int j=0;
while(true){//算出数组长度,最开始new的时候可以看到
if(*(pt+j)==-1)
break;
else
j++;
//cout<<"try"<<j<<endl;//用来debug
}
int co=j-1;//因为数组下标从0开始,所以减一。co是标识次数
bool pr=false;//这里是因为当最高次项的系数为0时,前面会多一个加号,所以这个用来判断前面是否输出过项,也就是说,前面是不是都为0。
while(true){
if(co==-1)
break;
if(*(pt+co)==0){//系数为0就跳过,看下一个
co--;
//cout<<"此处为0";//用来debug
continue;
}
else{
//cout<<"此处不为0";//用来debug
if(pr)//前面存在项的话就输出"+"。
cout<<" + ";
if(co>1)
cout<<*(pt+co)<<"x^"<<co;
else if(co==1)
cout<<*(pt+co)<<"x";
else
cout<<*(pt+co);
co--;
pr=true;//已经输出过一项,于是可以有"+"了
}
//cout<<"CO="<<co<<" \n";//用来debug
}
cout<<endl;
}
double polynomialVal(int *pt,double x){// 当自变量 x 的值已知时,求多项式的函数值
int j=0,i=0;
double xn=1,sum=0;
//pt[0]是常数项
while(pt[j]!=-1){//逐个计算每一项的值,再相加
i=j;
xn=1;
while(true){//计算x^n的值
if(i==0) break;
xn*=x;
i--;
}
sum+=(xn*pt[j]);
j++;
}
return sum;
}
int *polynomialAdd(int *pt1,int* pt2){//求两个多项式 pt1, pt2 的和,返回指向(求和)结果的指针。
int j1=0,j2=0;
while(true){//计算长度
if(*(pt1+j1)==-1)
break;
else
j1++;
}
while(true){//计算长度
if(*(pt2+j2)==-1)
break;
else
j2++;
}
j1--; j2--;
//cout<<"j1="<<j1<<"j2="<<j2<<endl; //用来debug
int j3=(j1>j2)?j1:j2;
for(int i=0;i<=j3;i++){//哪个次数更高就用哪个
if(i>j1){
*(pt1+i)=0;
}
if(i>j2){//他还有常数项!
*(pt2+i)=0;
}
if(j3>=j1)//以次数高的为基础再相加
*(pt1+i)+=*(pt2+i);
else
*(pt2+i)+=*(pt1+i);
}
if(j3>j2)
return pt1;
else
return pt2;
}
int main()
{
int *p1,*p2,*p3,num1=7,num2=5;
int maxval=50;
p1=getPolynomial(num1);
setPolyCoef(p1,maxval);
printPolynomial(p1);
double x=1.2;
cout<<"the polynomial p1's value when x="<<x<<" is:"<<polynomialVal(p1,x)<<endl;
p2=getPolynomial(num2);
setPolyCoef(p2,maxval);
printPolynomial(p2);
p3=polynomialAdd(p1,p2);
printPolynomial(p3);
cout<<"the polynomial p3's value when x="<<x<<" is:"<<polynomialVal(p3,x)<<endl;
releaseMem(p1);
releaseMem(p2);
return 0;
}
思路什么的我都写在注释里了,结合代码看效果更好(虽然我觉得我写得让人看不懂)。
(就先这样了,偷偷懒)先去准备期末了
希望有大佬能指出修改意见,欢迎大家交流各自的想法!
欢迎大家来我的小站看看
progress everyday!