大整数的加乘多项式运算

水平有限,代码粗糙。。。。。。。。。

将表达式转化成后缀表达形式,然后利用栈计算。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
using namespace std;
char str[10][100010];
char a[50];
char ts[50];


const int N=100010;
stack<char > Stack;
stack<char *> SS;
void c_to_d(char str[N], char d[N], int &start)
{//把str的各位转变成对应整数,右对齐存入d, start为最高位下标
int len; //strlen(str)=5 N=10 start =10-5=5
int i,j;
for(i=0;i<N;i++)
d[i]=0;
len=strlen(str);
start=N-len;
for(i=0,j=start;i<len;i++,j++)
d[j]=str[i]-'0';
}


void d_to_c(char d[N], char str[N], int start)
{
//把d中数字d[start...N-1]转变为字符左对齐存入str
int i,j;
int len=N-start;
for(i=0,j=start; i<len; i++,j++)
str[i]=d[j]+'0';
str[len]='\0';
}


//加法 addition
void add(char str_a[N], char str_b[N], char str_c[N])
{
char a[N], b[N],c[N]; //以右对齐的方式存储各位数
int i;
int start_a,start_b,start_c;//分别存储a,b,c中最高位的下标
int carry;//进位


//把str_a,str_b的各位转变成对应整数,右对齐存入a,b
c_to_d(str_a, a, start_a);
c_to_d(str_b, b, start_b);


//从低位到高位,对应位相加
i=N-1;
carry=0;
start_c=min(start_a,start_b);
while(i>=start_c)
{
c[i]=a[i]+b[i]+carry;
carry=c[i]/10;
c[i]=c[i]%10;
i--;
}
//如果有进位
if(carry>0)
{
start_c--;
c[start_c]=carry;
}


//把c转化为字符串str_c
d_to_c(c, str_c, start_c);
}
int compare(char str1[N], char str2[N])  //str1,str2内存的是要进行比较的大整数
{ //如果前者大于后者,返回正数,若相等返回0,否则返回负数
int len1,len2;
len1=strlen(str1);
len2=strlen(str2);
if(len1<len2)
return -1;
else if(len1>len2)return 1;
else
return strcmp(str1,str2);
}


//乘法multiplication
void mul(char str_a[N], char str_b[N], char str_c[N])
{
int len1, len2,i,j,k,carry;
char a[N], b[N], c[N], d[N];
int start_a, start_b, start_c, start_d;


len1=strlen(str_a);
len2=strlen(str_b);


//把str_a,str_b的各位转变成对应整数,右对齐存入a,b
c_to_d(str_a, a, start_a);
c_to_d(str_b, b, start_b);
memset(c, 0, sizeof(c));


//用b[j](j=N-1,N-2....,) 乘a,存入d,再把d累加到c中,注意错位问题,d的最低位下标不是N-1,而是j




for(j=N-1;j>=start_b;j--)
{
memset(d, 0, sizeof(d));
carry=0;
for(i=N-1,k=j;i>=start_a;i--,k--) //注意d的最低位下标从j开始,而不是从N-1开始
{
d[k]=a[i]*b[j]+carry;
carry=d[k]/10;
d[k]=d[k]%10;
}
//如果有进位
if(carry>0)
{
d[k]=carry;
k--;
}
start_d=k+1;


//把d累加到c中
carry=0;
for(i=N-1;i>=start_d;i--)
{
c[i]=c[i]+d[i]+carry;
carry=c[i]/10;
c[i]=c[i]%10;
}
//如果有进位
if(carry>0)
{
c[i]=carry;
i--;
}
}


start_c=i+1;


//把c转化为字符串str_c
d_to_c(c, str_c, start_c);
}


int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        scanf("%s",str[i]);
    scanf("%s",a);
    memset(ts,0,sizeof(ts));
    int k=0;
    for(int i=0;a[i]!='\0';i++)
    {
        if(a[i]>='a'&&a[i]<='z')
        {
            ts[k++]=a[i];
        }
        else if(a[i]=='+')
        {
            if(Stack.empty())
            {
                Stack.push('+');
            }
            else
            {
                while(!Stack.empty())
                {char x=Stack.top();
                if(x=='*'||x=='+')
                {
                    ts[k++]=x;
                    Stack.pop();
                }
                else if(x=='(')
                {
                    break;
                }
                }
                Stack.push('+');
            }
        }
        else if(a[i]=='*')
        {
            if(Stack.empty())
            {
                Stack.push(a[i]);
            }
            else
            {
                while(!Stack.empty())
                {char x=Stack.top();
                if(x=='*')
                {
                    ts[k++]=x;
                    Stack.pop();
                }
                else if(x=='+')
                {
                    break;
                }
                else if(x=='(')
                {
                    break;
                }
                }
                Stack.push(a[i]);
            }
        }
        else if(a[i]=='(')
        {
            Stack.push(a[i]);
        }
        else if(a[i]==')')
        {
            while(!Stack.empty())
            {
                char x=Stack.top();
                if(x!='(')
                {
                    ts[k++]=x;
                    Stack.pop();
                }
                else
                {
                    Stack.pop();
                    break;
                }
            }
        }
    }


    while(!Stack.empty())
    {
        ts[k++]=Stack.top();
        Stack.pop();
    }
    for(int i=0;ts[i]!='\0';i++)
    {
        if(ts[i]>='a'&&ts[i]<='z')
        {
            SS.push(str[ts[i]-'a']);
        }
        else
        {
            if(ts[i]=='+')
            {
                char *s3=new char[N];
                char *s1=SS.top();
                SS.pop();
                char *s2=SS.top();
                SS.pop();
                add(s1,s2,s3);
                SS.push(s3);
            }
            else if(ts[i]=='*')
            {
                char *s3=new char[N];
                char *s1=SS.top();
                SS.pop();
                char *s2=SS.top();
                SS.pop();
                mul(s1,s2,s3);
                SS.push(s3);
            }
        }




    }
    char *t=SS.top();
    puts(t);
    SS.pop();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值