一、高精度加法
nefu594 又是比大小
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a,b,c;
int i;
while(cin>>a>>b>>c)
{
int xa[1000]={},xb[1000]={},xc[1000]={};
//转为数字数组
for(i=0;i<a.length();i++)
xa[i]=a[a.length()-i-1]-'0';
for(i=0;i<b.length();i++)
xb[i]=b[b.length()-i-1]-'0';
for(i=0;i<c.length();i++)
xc[i]=c[c.length()-i-1]-'0';
//高精度加法
int cnt=max(a.length(),b.length());
for(i=0;i<cnt;i++)
{
int t=xa[i]+xb[i];
xa[i+1]+=t/10;
xa[i]=t%10;
}
cnt=(cnt>c.length())?cnt:c.length();
//高精度比较
bool check=true,same=true;
for(i=cnt;i>=0;i--)
{
if(xc[i]!=xa[i])same=false;
if(xa[i]>xc[i])break;
if(xa[i]<xc[i]){check=false;break;}
}
if(same)cout<<"NO"<<endl;
else check?cout<<"YES"<<endl:cout<<"NO"<<endl;
}
return 0;
}
二、高精度减法
P2142 高精度减法
这个题有两个坑:
1.去除前导0
关键代码 while(!xa[i]&&i)i--;
如果没有,55-55就会等于00
2.小数减大数得负数的情况
用到公式:(a-b)= -(b-a)
解决思路:特判
特判当字符串1所表示的数小于字符串2所表示的数
关键代码if((a<b&&a.size()==b.size())||a.size()<b.size())
这里的字符串比较a<b需注意,规则大概如下:
从最高位比起,ASCIIASCII码更大的字符串更大。如果相等,比次高位,以此向下类推。
例如:9<89,因为9>8
12300>123,前三位相等,但是前面的字符串位数多
#include <bits/stdc++.h>
using namespace std;
bool pd;
string a,b;
int main()
{
cin>>a>>b;
if((a<b&&a.size()==b.size())||a.size()<b.size())
{
swap(a,b);
pd=true;
}
int i;
int xa[10500]={0},xb[10500]={0};
for(i=0;i<a.length();i++)xa[i]=a[a.length()-i-1]-'0';
for(i=0;i<b.length();i++)xb[i]=b[b.length()-i-1]-'0';
int t;
for( i=0;i<max(a.length(),b.length());i++)
{
t=xa[i]-xb[i];
if(t<0){xa[i]=t+10;xa[i+1]--;}
else xa[i]=t;
}
while(!xa[i]&&i)i--;//很重要,去掉前导0
if(pd==true)cout<<"-";
for(;i>=0;i--)cout<<xa[i];
return 0;
}
三、高精度乘法
关键代码:
for(i=0;i<a.length();i++)
for(j=0;j<b.length();j++)
{
c[i+j]+=xa[i]*xb[j];
}
完整代码
#include <bits/stdc++.h>
using namespace std;
bool pd;
string a,b;
int xa[10005],xb[10005],c[10005];
int main()
{
cin>>a>>b;
int i,j;
for(i=0;i<a.length();i++)xa[i]=a[a.length()-i-1]-'0';
for(i=0;i<b.length();i++)xb[i]=b[b.length()-i-1]-'0';
for(i=0;i<a.length();i++)
for(j=0;j<b.length();j++)
{
c[i+j]+=xa[i]*xb[j];//+=容易丢
}
for(i=0;i<a.length()+b.length();i++)
{
if(c[i]>=10)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
}
while(!c[i]&&i)i--;
for(;i>=0;i--)cout<<c[i];
return 0;
}