2 charles su Charles_Su 于 2016.03.30 01:03 提问

谁能帮我看下下面这段代码,多项式乘法和+=操作运行不了,求助啊,到底错在哪了

#include
#include
using namespace std;
class Polynomial
{
double *p_coefs;
int *p_exps, num;
public:
Polynomial();
Polynomial(double coefs[], int exps[], int size);//系数数组、指数数组和项数
Polynomial(const Polynomial&x);
~Polynomial();
//赋值操作符
Polynomial &operator=(const Polynomial&x)
{
if (&x == this) return *this;
num = x.num;
delete[]p_coefs;
delete[]p_exps;
p_coefs = new double[x.num];
p_exps = new int[x.num];
for (int i = 0; i <x. num; i++) { p_coefs[i] = x.p_coefs[i]; }
for (int j = 0; j <x.num; j++) { p_exps[j] = x.p_exps[j]; }
return *this;
}
//最高幂指数
int degree()const
{
return p_exps[num - 1];
}
//计算多项式的值
double evaluate(double x) const
{
double value = 0, temp = x;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < p_exps[i]; j++) x *= temp;
x *= p_coefs[i];
value += x;
x = temp;
}
return value;
}
//判断两多项式是否相等
bool operator==(const Polynomial&x)const
{
if (num != x.num)return false;
for (int i = 0; i < num; i++)
if (p_exps[i] != x.p_exps[i] || p_coefs[i] != x.p_coefs[i])return false;
return true;
}
//判断两多项式是否不相等
bool operator!=(const Polynomial&x)const
{
if (num != x.num) return true;
for (int i = 0; i < num; i++)
if (p_exps[i] != x.p_exps[i] || p_coefs[i] != x.p_coefs[i])return true;
return false;

}
//多项式的加法
Polynomial operator+(const Polynomial&x)const
{
    Polynomial new_poly;
    new_poly.num = num + x.num;
    new_poly.p_coefs = new double[num +x.num];
    new_poly.p_exps = new int[num + x.num];
    for (int i = 0; i < num; i++) { new_poly.p_coefs[i] = p_coefs[i]; }
    for (int j = 0; j < num; j++) { new_poly.p_exps[j] = p_exps[j]; }
    for (int i = num; i <new_poly.num; i++) { new_poly.p_coefs[i] = x.p_coefs[i - num]; }
    for (int j = num; j <new_poly.num; j++) { new_poly.p_exps[j] = x.p_exps[j - num]; }
    for (int i = 0; i < new_poly.num; i++)
        for (int j = i + 1; j < new_poly.num; j++)
        {
            if (new_poly.p_exps[i] == new_poly.p_exps[j])
            {
                new_poly.p_coefs[i] = new_poly.p_coefs[i] + new_poly.p_coefs[j];
                new_poly.p_coefs[j] = 0;
            }
        }
    return new_poly;
}
//多项式的减法
Polynomial operator-(const Polynomial&x)const
{
    Polynomial poly,poly1;
    poly.num = num ;
    poly.p_coefs = new double[num];
    poly.p_exps = new int[num];
    for (int i = 0; i < x.num; i++) { poly.p_coefs[i] =p_coefs[i]; }
    for (int j = 0; j < x.num; j++) { poly.p_exps[j] = p_exps[j]; }
    poly1.num = x.num;
    poly1.p_coefs = new double[x.num];
    poly1.p_exps = new int[x.num];
    for (int i = 0; i < x.num; i++) { poly1.p_coefs[i] = -x.p_coefs[i]; }
    for (int j = 0; j < x.num; j++) { poly1.p_exps[j] = x.p_exps[j]; }
    return poly+poly1;
}
//多项式的乘法
Polynomial operator*(const Polynomial&x)const
{
    Polynomial *p,sum;
    p = new Polynomial[num];
     for (int i = 0; i < num;i++)
    { 
        for (int j = 0; j < x.num; j++)
        {
            p[i].p_coefs[j] = p_coefs[i] * x.p_coefs[j];
            p[i].p_exps[j] = p_exps[i] + x.p_exps[j];

        }

     }
     for (int i = 0; i < num; i++) {
         sum =sum+p[i];
     }
    return sum;

}
//多项式的加法
Polynomial& operator+=(const Polynomial&x)
{
    {return *this+ x; }
}
//多项式的减法
Polynomial& operator-=(const Polynomial&x)
{return *this - x;}
Polynomial& operator*=(const Polynomial&x)
{
    return *this * x;
}
void display()const;

};
//下面两个重载函数实现构造函数
Polynomial::Polynomial()
{
p_coefs = NULL; p_exps = NULL;
num = 0;
}
Polynomial::Polynomial(double coefs[], int exps[], int size)
{
num = size;
p_coefs = new double[num];
p_exps = new int[num];
for (int i = 0; i < num; i++) { p_coefs[i] = coefs[i]; }
for (int j = 0; j < num; j++) { p_exps[j] = exps[j]; }
}
Polynomial::Polynomial(const Polynomial&x)
{

num = x.num;
p_coefs = new double[num];
p_exps = new int[num];
for (int i = 0; i < num; i++) { p_coefs[i] = x.p_coefs[i]; }
for (int j = 0; j < num; j++) { p_exps[j] = x.p_exps[j]; }

}
//析构函数
Polynomial::~Polynomial()
{
delete[]p_coefs;
p_coefs = NULL;
delete[]p_exps;
p_exps = NULL;
num = 0;
}

//显示多项式
void Polynomial::display()const
{
double t1;
int t2;
//冒泡排序
for (int j = 0; j < num - 1; j++)
for (int i = 0; i < num - 1 - j; i++)
if (p_exps[i]>p_exps[i + 1])
{
t1 = p_coefs[i]; t2 = p_exps[i];
p_coefs[i] = p_coefs[i + 1]; p_exps[i] = p_exps[i + 1];
p_coefs[i + 1] = t1; p_exps[i + 1] = t2;
}
if (p_coefs[0] != 0)
{
if (p_exps[0] != 0 && p_exps[0] != 1)
{
if (p_coefs[0] != 1 && p_coefs[0] != -1)cout << p_coefs[0] << "x^" << p_exps[0];
else if (p_coefs[0] == 1)cout << "x^" << p_exps[0];
else cout << "-x^" << p_exps[0];
}
else if (p_exps[0] == 0)
{
cout << p_coefs[0];
}
else
{
if (p_coefs[0] != 1 && p_coefs[0] != -1)cout << p_coefs[0] << "x";
else if (p_coefs[0] == 1)cout << "x";
else cout << "-x";
}

}
for (int i = 1; i < num; i++)
{
    if (p_coefs[i] != 0)
    {
        if (p_exps[i] != 0 && p_exps[i] != 1)
        {
            if (p_coefs[i] > 0 && p_coefs[i] != 1 && p_coefs[i] != -1)cout << '+' << p_coefs[i] << "x^" << p_exps[i];
            else if (p_coefs[i] == 1)cout << "+x^" << p_exps[i];
            else if (p_coefs[i] == -1)cout << "-x^" << p_exps[i];
            else cout << p_coefs[i] << "x^" << p_exps[i];
        }
        else if (p_exps[i] == 0)
        {
            cout << p_coefs[i];
        }
        else
        {
            if (p_coefs[i] != 1 && p_coefs[i] != -1)cout << p_coefs[i] << "x";
            else if (p_coefs[i] == 1)cout << "x";
            else cout << "-x";
        }

    }
}
cout << endl;

}
int main()
{
double a[5] = { 1,2,3,4,5 }, i[5] = { 1,3,5,7,10 };
int c = 5, b[5] = { 1,2,3,4,5 }, j[5] = { 1,3,5,8,7 };
Polynomial poly1(a, b, c), poly2, poly3(i, j, c),poly4,poly5;
cout << "多项式一:"; poly1.display();
poly2 = poly1;
cout << "多项式二:"; poly2.display();
cout << "多项式三:"; poly3.display();
cout <<"多项式一最高次幂:"<< poly1.degree() << endl;
cout << "多项式一值为:" << poly1.evaluate(3) << endl;
cout <<"多项式二与三是否相等:"<< boolalpha << (poly2 == poly3) << endl;
cout << "多项式二与三是否不相等:" << boolalpha << (poly2 != poly3) << endl;
cout << "多项式一与三的和:"; (poly1 + poly3).display();
cout << "多项式一与三的差:"; (poly1 - poly3).display();
cout << "多项式一与三的积:"; (poly1 * poly3).display();
poly2 += poly3;
cout << "多项式二增加后:"; poly2.display();
poly2 -= poly3;
cout << "多项式二减少后:"; poly2.display();
poly2 *= poly3;
cout << "多项式二相乘后:"; poly2.display();
system("pause");
return 0;
}

3个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.30 09:21
已采纳

多项式乘法中,楼主光new Polynomial[num]是不够的 ,还需要为里面的double数组,int数组也都需要new,num也要赋值
加的三句我加注释了

 //多项式的乘法
    Polynomial operator*(const Polynomial&x)const
    {
        Polynomial *p,sum;
        p = new Polynomial[num];
        for (int i = 0; i < num;i++)
        { 
            p[i].p_coefs = new double[x.num]; //要new
            p[i].p_exps = new int[x.num];        //要new
            p[i].num = x.num;                       //num也要赋值
            for (int j = 0; j < x.num; j++)
            {
                p[i].p_coefs[j] = p_coefs[i] * x.p_coefs[j];
                p[i].p_exps[j] = p_exps[i] + x.p_exps[j];
            }

        }
        for (int i = 0; i < num; i++) {
            sum =sum+p[i];
        }
        return sum;
    }

结果:
图片说明

Charles_Su
Charles_Su 回复小灸舞: 谢谢,大神![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/5.gif)[图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/5.gif)[图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/5.gif)
2 年多之前 回复
qq423399099
qq423399099 回复Charles_Su: 我回复在另一个帖了,你要把相加后的和重新再赋值给this.....
2 年多之前 回复
Charles_Su
Charles_Su 回复小灸舞: 是的,为什么是错的![图片说明](http://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/1.gif)
2 年多之前 回复
qq423399099
qq423399099 回复Charles_Su: 你是说求积后面打印的那三行么。。。我还在想怎么打印出来的都是一样的。。。
2 年多之前 回复
Charles_Su
Charles_Su 那我的自加,自减,自乘操作为什么不对啊?
2 年多之前 回复
qq423399099
qq423399099   Ds   Rxr 2016.03.30 14:31

你需要把相加后的值重新再赋给this指针,不然等于在函数里做了个加法,并没有把它们的和赋值给任何变量

 //多项式的加法
    Polynomial& operator+=(const Polynomial&x)
    {
        *this = *this + x;
        return *this;
    }
devmiao
devmiao   Ds   Rxr 2016.03.30 07:00
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
编程到底难在哪里?
编程到底难在哪?看了下面这个买苹果的例子你就会明白…… 普通人:我今天要买一斤苹果。 程序员:我今天要买一斤苹果—— 因为我只喜欢红富士苹果,所以我只买红富士苹果。 我能接受的最高价格是10元/斤。 正常情况下一斤苹果用一个袋子能装下,但是为防万一,我会带两个袋子。 我知道附近的3家水果店,所以我会依次访问这3家水果店。 根据上述条
清华大学图书管理系统数据库设计
我从图书馆光盘里拷的清华大学的数据库案例设计,怎么运行不了啊,谁能帮我改改。。。非常感谢
数据结构学习笔记(二)多项式加法与乘法
之前自己看书学链表、栈、队列,觉得比较难懂,还是得自己动手实践下。这次就是实现一个多项式的加法和乘法运算,主要是要求熟练链表的各种操作。 看看程序的大体框架是: 设计数据结构:多项式的表示。可以用数组和链表。数组需事先确定数组大小,链表则对动态操作比较有利。 读多项式:这里需要设计一个attach函数,是用来将新的结点插入链尾的。 加法实现:多项式相加其实就是比较指数,相同则合并同类项,不同则直接
获取ACCESS97数据库密码,大家帮我一下错在哪了.
获取ACCESS97数据库密码,大家帮我一下错在哪了.
多项式乘法运算初级版
快速傅里叶变换在信息学竞赛中主要用于求卷积,或者说多项式乘法。我们知道,多项式乘法的普通算法时间复杂度 是,通过快速傅里叶变换可以使时间降为,那么接下来会详细介绍快速傅里叶变换的原理。   首先来介绍多项式的两种表示方法,即系数表示法和点值表示法。从某种意义上说,这两种方法是等价的。先设           (1)系数表示法       对于一个次数界为的多项式来说,其系数表
VC++代码
我这段代码里面有模糊查询的,我不知道错误在哪,请高手帮忙看下,谢谢了!
多项式相乘(C语言)
多项式相乘(C语言)
简单的多项式乘法实现程序 C语言
用C语言编写的简单的多项式乘法程序,用于实现低次的多次式相乘,简便快捷。
1.多项式乘法实现
对于稀疏多项式,采用数组存储效率低下,因此考虑采用链表结构,节点包括系数,指数,next指针三个域。多项式的运算中,主要要考虑的是同类项合并的问题,这实际是一个数组元素去重的问题(合并幂相同的节点),因此可以采用先排序(快排平均O(Nlog(N))),后遍历(O(N))的方式完成。总时间O(nlog(n))。#include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib....
图的遍历 帮我看下错在哪里啊
#include "stdio.h" #include "malloc.h"   //堆的头文件 #define maxVertices  30         //图中定点数目的最大值 #define maxWeight  65535;  //用65535代表无穷大 //--------------图的类型和操作的定义------------------------ typedef c