高精度加法
#include<bits/stdc++.h>
using namespace std;
int x[1000005];
int main()
{
string a,b;
cin>>a>>b;
if(a.size()<b.size())
swap(a,b);
for(int i=1; i<=a.size(); i++)
x[i]=a[a.size()-i]-'0';
for(int i=1; i<=b.size(); i++)
x[i]+=b[b.size()-i]-'0';
for(int i=1; i<=a.size(); i++)
{
if(x[i]>=10)
{
x[i]-=10;
x[i+1]++;
}
}
int len=a.size();
if(x[len+1]>0)
len++;
for(int i=len; i>=1; i--)
printf("%d", x[i]);
}
做法:得到两个数字串a,b以后,使a串长度默认比b大,否则交换,然后用x数组倒着装a,b两个数字串,然后相加,大于10的进一位,然后特判有没有长度+1,最后在将x数组倒着输出即可。
高精度减法
#include<bits/stdc++.h>
using namespace std;
int x[10005];
int main()
{
string a,b;
cin>>a>>b;
int flag=0;
if(a.size()<b.size())
{
swap(a,b);
flag=1;
}
if(a.size()==b.size())
{
for(int i=0; i<a.size(); i++)
{
if(a[i]<b[i])
{
flag=1;
break;
}
}
if(flag==1)
swap(a,b);
}
for(int i=1; i<=a.size(); i++)
x[i]=a[a.size()-i]-'0';
for(int i=1; i<=b.size(); i++)
x[i]-=b[b.size()-i]-'0';
for(int i=1; i<=a.size(); i++)
{
if(x[i]<0)
{
x[i]+=10;
x[i+1]--;
}
}
int len=a.size();
while(x[len]==0)
{
len--;
if(len==0)
{
printf("0");
return 0;
}
}
if(flag==1)
printf("-");
for(int i=len; i>=1; i--)
printf("%d", x[i]);
return 0;
}
做法:先判断一下被减数和减数的大小关系,如果被减数更小的话用flag记录一下输出时加负号,同时在交换一下a,b,使默认a比b大,然后用x数组倒着装a,然后再倒着减b数组,
然后判断x数组有没有负数,有的话+10,后面一位-1,最后特判一下x数组长度,末尾0要去掉,然后倒着输出即可。
高精度乘法
#include<bits/stdc++.h>
using namespace std;
int x[5000];
int m[5000],n[5000];
int main()
{
string a,b;
cin>>a>>b;
for(int i=1; i<=a.size(); i++)
m[i]=a[a.size()-i]-'0';
for(int i=1; i<=b.size(); i++)
n[i]=b[b.size()-i]-'0';
for(int i=1; i<=a.size(); i++)
for(int j=1; j<=b.size(); j++)
x[i+j-1]+=m[i]*n[j];
for(int i=1; i<=a.size()+b.size(); i++)
{
if(x[i]>=10)
{
x[i+1]+=x[i]/10;
x[i]=x[i]%10;
}
}
int len=a.size()+b.size();
while(x[len]==0)
{
len--;
if(len==0)
{
printf("0");
return 0;
}
}
for(int i=len; i>=1; i--)
printf("%d", x[i]);
}
做法:先将两个读入的数字字符串倒着装到两个整形数组中,然后模拟乘法,然后每一位数字/10是多少下一位加多少,本位对10取余,最后从末第一个不为零的数字倒着输出即可