胖哒叔叔又回来啦!你们想我了吗?今天给大家带来一道题目《大数运算》
题目描述 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;
}