2743 大数运算

胖哒叔叔又回来啦!你们想我了吗?今天给大家带来一道题目《大数运算》


题目描述 Description

请你对n组数据进行相对应的大数运算,每组数据会先给出两个正整数,位数最多为1000位,再是一个符号," + " 或 " - " 或 " * ",如果是" + " 则对这两个数字进行加法运算,如果是 " - " 则计算这两个数字减法运算的绝对值,如果是 " * "则计算这两个数字乘积的结果,输出最后的计算结果 。

输入描述 Input Description

第一行:n,n<50
接下来n行:每行先是两个正整数,每个数字的位数最多为1000位,再是一个符号

输出描述 Output Description

n行:每次运算的结果为一行

样例输入 Sample Input

3
2 1 +
10 3 -
6 2 *

样例输出 Sample Output

3
7
12

数据范围及提示 Data Size & Hint

数据保证每行的第一个正整数比第二个正整数大

#include<bits/stdc++.h>
using namespace std;
string a,b;//最初输入的字符串
int Size_a[1010],Size_b[1010],result[1000000],k;//字符串的长度和最后结果
void Jia()
{
    k=1;
    int S=0;//表示进位
    while(k<=a.size()||k<=b.size())
    {
        result[k]=Size_a[k]+Size_b[k]+S;//两数相加 
        S=result[k]/10;//进位 
        result[k]%=10;
        k++;
    }
    result[k]=S;
    if(result[k]==0)//处理最高位 
        k--;
}
void Jian()
{
    k=1;
    while(k<=a.size()||k<=b.size())
    {
        if(Size_a[k]<Size_b[k])//不够减 
        {
            Size_a[k]+=10;
            Size_a[k+1]--;
        }
        result[k]=Size_a[k]-Size_b[k];//对应位相减
        k++;
    }
    while((result[k]==0)&&(k>1))
        k--;//最高位的0不输出
}
void Cheng()
{
    int S;//进位 
    for(int i=1;i<=a.size();i++)
    {
        S=0;
        for(int j=1;j<=b.size();j++)//对乘数的每一步进行处理 
        {
            result[i+j-1]=Size_a[i]*Size_b[j]+S+result[i+j-1];//当前乘积+上次乘积进位+原数
            S=result[i+j-1]/10;
            result[i+j-1]%=10; 
        }
        result[i+b.size()]=S;//进位 
    }
    k=a.size()+b.size();
    while(result[k]==0&&k>1)//删除前导0
        k--;
}
int main()
{
    int n;
    char symbol;//运算符号
    cin>>n;
    for(int i=1;i<=n;i++)//循环n次
    {
        cin>>a>>b>>symbol;//输入 
        Size_a[0]=a.size();
        Size_b[0]=b.size();
        for(int j=1;j<=Size_a[0];j++)//加数放入数组 
            Size_a[j]=a[Size_a[0]-j]-48;
        for(int j=1;j<=Size_b[0];j++)
            Size_b[j]=b[Size_b[0]-j]-48;                                               
        if(symbol=='+')//判断,看是什么运算
            Jia();
        else if(symbol=='-')
            Jian();
        else if(symbol=='*')
            Cheng();
        for(int j=k;j>=1;j--)
            cout<<result[j];
        memset(Size_a,0,sizeof(Size_a));//清零 
        memset(Size_b,0,sizeof(Size_b));
        memset(result,0,sizeof(result));
        cout<<endl;
    }
    return 0;
}

 

转载于:https://my.oschina.net/u/4201138/blog/3100276

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值