本题为高精度最后一题(也不一定),毕竟乘除b≤10^9,作者尽力了更好的以后更新,如想看分开的加减乘除及比大小(函数我都写在里面了,自己理解自己用)
题目描述
输入两个正整数 a 和 b, 和一个字符表示运算种类, 计算a 和 b的运算结果并输出
【输入格式】
第一行 , 一个正整数, 表示a
第二行,一个字符, 表示运算符
第三行,一个正整数, 表示b
【输出格式】
一行 , 输出 a 和 b 的运算结果
如果运算符为 '+', 输出 a+b;
如果运算符为 '-', 输出 |a−b∣;
如果运算符为 '*', 输出 a×b;
如果运算符为 '/', 输出 a÷b。
【数据范围】
1≤a≤10^1000
对于加减运算: 1≤b≤10^1000
对于乘除运算: 1≤b≤10^9
这题我不写多余的注释了,在这里讲了:思路很简单,就是用数组来模拟竖式运算过程。函数代表什么意思在注释里
#include<bits/stdc++.h>
using namespace std;
void s2big(string s,int a[])//将字符串转数组
{
int la=s.size();
a[0]=la;
for(int i=1;i<=la;i++)
{
a[i]=s[la-i]-'0';
}
}
void i2big(int n,int a[])//将int类型转数组
{
int la=0;
while(n!=0)
{
la++;
a[la]=n%10;
n/=10;
}
if(la==0) la++;
a[0]=la;
}
void printbig(int a[])//输出高精度数
{
int la=a[0];
for(int i=la;i>=1;i--)
{
cout << a[i];
}
cout << endl;
}
void sumbig(int x[],int y[],int z[])//高精度加法,将x+y的结果存到z里
{
z[0]=max(x[0],y[0]);
for(int i=1;i<=z[0];i++)
{
z[i]=x[i]+y[i];
}
for(int i=1;i<=z[0];i++)
{
z[i+1]+=z[i]/10;
z[i]%=10;
if(z[z[0]+1]>0)
z[0]++;
}
}
bool cmpbigx(int x[],int y[])//判断x是否小于y
{
int lx=x[0],ly=y[0];
if(lx!=ly)return lx<ly;
for(int i=lx;i>=1;i--)
{
if(x[i]!=y[i])
return x[i]<y[i];
}
return 0;
}
bool cmpbigda(int x[],int y[])//判断x是否大于y
{
int lx=x[0],ly=y[0];
if(lx!=ly)return lx>ly;
for(int i=lx;i>=1;i--)
{
if(x[i]!=y[i])
return x[i]>y[i];
}
return 0;
}
bool cmpbigde(int x[],int y[])//判断x是否等于于y
{
int lx=x[0],ly=y[0];
if(lx!=ly)return 0;
for(int i=lx;i>=1;i--)
{
if(x[i]!=y[i])
return 0;
}
return 1;
}
void mulbig(int x[],int y,int z[])//高精度乘法
{
z[0]=x[0];
for(int i=1;i<=z[0];i++)
{
z[i]=x[i]*y;
}
for(int i=1;i<=z[0];i++)
{
z[i+1]+=z[i]/10;
z[i]%=10;
if(z[z[0]+1]>0)
z[0]++;
}
}
void subbig(int x[],int y[],int z[])//高精度减法
{
z[0]=max(x[0],y[0]);
for(int i=1;i<=z[0];i++)
z[i]=x[i]-y[i];
for(int i=1;i<=z[0];i++)
{
if(z[i]<0)
{
z[i]+=10;
z[i+1]--;
}
}
while(z[z[0]]==0&&z[0]>1) z[0]--;
}
void divbig(int x[],int y,int z[])//高精度除法
{
z[0]=x[0];
int r=0;
for(int i=z[0];i>=1;i--)
{
int t=r*10+x[i];
z[i]=t/y;
r=t%y;
}
while(z[z[0]]==0&&z[0]>1) z[0]--;
}
int A[1010],B[1010],ANS[1010];
int main()
{
char op;
cin >> op;
string a;
cin >> a;
s2big(a,A);
if(op=='+')
{
string b;
cin >> b;
s2big(b,B);
sumbig(A,B,ANS);
}
if(op=='-')
{
string b;
cin >> b;
s2big(b,B);
if(cmpbigx(A,B))
subbig(B,A,ANS);
else
subbig(A,B,ANS);
}
if(op=='*')
{
int b;
cin >> b;
mulbig(A,b,ANS);
}
if(op=='/')
{
int b;
cin >> b;
divbig(A,b,ANS);
}
printbig(ANS);
return 0;
}
//本题原创:憨憨是我1,完结撒花!!!!!!!!!
全体起立,点赞加关注加留言,我肝了三周!!!