一元多项式加法

帮别人写的,多C++不熟悉,估计写的比较垃圾,但是花了好几个小时,还是记录下。

#include <iostream>
#include <string>
using namespace std;

//节点
struct Node
{
    
int coefficient;//因数
    
int exponent;//指数
    
Node next;//下一个节点指针
};

Node head;//创建链表时的临时头节点指针
Node nail;//创建链表时的临时尾节点指针
Node head1;//多项式1链表头节点指针
Node head2;//多项式2链表头节点指针
Node p;//释放空间的临时指针
string s1,s2;//存放用户输入的临时字符串
char string1[100];//存放用户输入的多项式1
char string2[100];//存放用户输入的多项式2
int number1[100];//以整数数组形式存放的多项式1,形式为一个系数一个指数,一个系数一个指数
int number2[100];//以整数数组形式存放的多项式2,形式为一个系数一个指数,一个系数一个指数
int sz[2][100]={0};//结果存放数组,第一行指数,第二行系数

//创建节点,参数coefficient,exponent
Node createNode(int cint e)
{
    
Node x=new Node();
    
x->coefficient=c;
    
x->exponent=e;
    
return x;
}

//取得数组存放系数指数一共用去的长度
int getLength(int a)
{
    
for(int i=0;i<100;i+=2)
    {
        
if(*(a+i)==0&&*(a+i+1)==0)
            
return i;
    }
    
return 0;
}

//产生链表
Node createLink(int a)
{
    
int c,e;
    
int l=getLength(a);
    
//产生链表头
    
c=a[0];
    
e=a[1];
    
head=nail=createNode(c,e);
    
//产生其他节点
    
for(int i=2;i<l;i+=2)
    {
        
c=a[i];
        
e=a[i+1];
        
nail->next=createNode(c,e);
        
nail=nail->next;
    }
    
return head;
}

//查找字符串种某个字符的位置
char positionOf(char startchar endchar c)
{
    
char *p=start;
    
while(p<=end)
    {
        
if(*p==c)
            
return p;
        
p++;
    }
    
return NULL;
}

//将输入多项式转化为int数组,形式为一个系数一个指数,一个系数一个指数
void convert(char cint i)
{
    
//以加减号作为分隔符,分输入数据为节,start节开始,end为节结束
    
char start;
    
char end;
    
int n=0;//数组项目编号
    
start=end=c;
    
while(*end!='/0')
    {
        
//start指针指向第一次出现符号的位置
        
while(*start!='+'&&*start!='-'&&*start!='/0')
        {
            
if(*(start+1)!='/0')
                
start++;
        }

        
if(*(end+1)!='/0')
            
end++;

        
while(*end!='+'&&*end!='-'&&*end!='/0')
            
end++;

        
//取系数,系数为0表示以x,+,-打头
        //字符串转整数,从+,-或者数字打头开始转换,非法的则转成0
        
int coe=0;
        
if(*start=='x'||*start=='X')
            
coe=1;
        
else if(*start=='-')
            
atoi(start+1)==0?coe=-1:coe=-atoi(start+1);
        
else if(*start=='+')
            
atoi(start+1)==0?coe=1:coe=atoi(start+1);
        
if(*(start+1)=='0')
            
coe=0;
        
i[n]=coe;
        
if(positionOf(start,end,'X')==NULL&&positionOf(start,end,'x')==NULL)//无x或X,则指数为0
        
{
            
i[n+1]=0;
        }
        
else//有x
        
{
            
char p=positionOf(start,end,'^');
            
if(p==NULL)
                
i[n+1]=1;
            
else
                
i[n+1]=atoi(p+1);
        }
        
start=end;
        
end++;
        
n+=2;//一个系数一个指数,每个节占两个位置
    
}
}


//读取用户输入
void readInput()
{    
    
cout<<"请输入多项式1:"<<endl;
    
cin>>s1;
    
cout<<"请输入多项式2:"<<endl;
    
cin>>s2;

    
//非负数开头则加上正号,便于后面处理
    
if(s1.substr(0,1)!="-"&&s1.substr(0,1)!="+")
        
s1="+"+s1;
    
strcpy(string1,s1.c_str());
    
if(s2.substr(0,1)!="-"&&s2.substr(0,1)!="+")
        
s2="+"+s2;
    
strcpy(string2,s2.c_str());

    //将输入转化为int数组、
    
convert(string1number1);
    
convert(string2number2);
}


//相加
void add()
{
    
Node p1=head1;
    
Node p2=head2;
    
int c,e;//c系数,e指数

    //遍历第一个链表,将指数,系数存入数组
    
while(p1!=NULL)
    {
        
c=p1->coefficient;
        
e=p1->exponent;
        
sz[0][e]=e;
        
sz[1][e]+=c;
        
p1=p1->next;
    }
    
//遍历第二个链表,将指数,系数存入数组
    
while(p2!=NULL)
    {
        
e=p2->exponent;
        
c=p2->coefficient;
        
sz[0][e]=e;
        
sz[1][e]+=c;
        
p2=p2->next;
    }

}

//打印结果
void printResult()
{
    
cout<<endl<<"相加结果:"<<endl;
    
int flag=0;//判定是否有输出
    //遍历结果数组
    
for(int j=99;j>=0;j--)
    {
        
if(sz[1][j]!=0)
        {
            
//系数
            
if(sz[1][j]>=1)
                
cout<<"+"<<sz[1][j];//大于+1则全部输出
            
if(sz[1][j]<-1)
                
cout<<sz[1][j];
            
if(sz[1][j]==-1)//-1则只保留负号
                
cout<<"-";


            
//指数
            
if(sz[0][j]>1)
                
cout<<"X^"<<sz[0][j];
            
else if(sz[0][j]==1)
                
cout<<"X";

            
flag=1;//已经有输出
        
}
    }

    
//结果是0则前面不会输出,这里输出结果为0
    
if(!flag)
        
cout<<0;
    
cout<<endl<<endl<<endl;
}

//释放空间,还原变量
void release()
{
    
while(head1!=NULL)
    {
        
p=head1;
        
head1=head1->next;
        
free(p);
    }
    
while(head2!=NULL)
    {
        
p=head2;
        
head2=head2->next;
        
free(p);
    }

    
for(int i=0;i<100;i++)
    {
        
number1[i]=0;
        
number2[i]=0;
    }
    
for(int i=0;i<2;i++)
    {
        
for(int j=0;j<100;j++)
            
sz[i][j]=0;
    }
    
s1=s2="";
    
for(int i=0;i<100;i++)
        
string1[i]=string2[i]='/0';
}

//程序入口
void main()
{
    
cout<<"**********************************************************"<<endl;
    
cout<<"@@多项式加法程序@@"<<endl<<endl;
    
cout<<"说明:请确保输入的多项式为-3X^2+2X-3,x大小写不限,"<<endl;
    
cout<<"      每个多项式长度不超过100个字符,否则结果会出错。"<<endl;
    
cout<<"**********************************************************"<<endl<<endl;

    
while(1)
    {
        
//读取用户输入
        
readInput();

        
//创建链表1
        
head1=createLink(number1);

        
//创建链表2
        
head2=createLink(number2);

        
//两式表相加
        
add();

        
//打印结果
        
printResult();

        
//释放空间
        
release();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值