网上大多介绍了判断x+y溢出的那种情况。以下介绍A+B高精度算法。需要判断符号,较麻烦。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
using namespace std;
string cal(string a,int aflag,string b,int bflag)
{
string tmp="";
int qq=a.size()-b.size();
for(int i=0;i<qq;i++)
{
b.insert(0,"0");
}
if((aflag==0&&bflag==0)||(aflag==1&&bflag==1))
{
int jinwei=0;
int maxx=a.size();
for(int i=maxx-1;i>=0;i--)
{
int sum=a[i]-'0'+b[i]-'0'+jinwei;
//cout<<sum<<endl;
if(sum>=10)
{
jinwei=1;
tmp+=sum-10+'0';
}
else
{
jinwei=0;
tmp+=sum+'0';
}
}
if(jinwei==1)
{
tmp+='1';
}
}
else
{
int jinwei=0;
int maxx=a.size();
for(int i=maxx-1;i>=0;i--)
{
int sum=a[i]-'0'-(b[i]-'0')-jinwei;
if(sum<0)
{
jinwei=1;
tmp+=sum+10+'0';
}
else
{
jinwei=0;
tmp+=sum+'0';
}
}
}
int num=tmp.size();
for(int i=0;i<num/2;i++)
{
swap(tmp[i],tmp[num-1-i]);
}
while(tmp[0]=='0'&&tmp.size()!=1)
{
tmp.erase(0,1);
}
//cout<<tmp;
return tmp;
}
bool f(string x,string y)
{
if(x.size()!=y.size())
{
return x.size()>y.size()?true:false;
}
else
{
if(x>y)
return true;
else
return false;
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
string s1;
string s2;
string s3;
cin>>s1>>s2>>s3;
int flag1=0;
int flag2=0;
int flag3=0;
int flag;
if(s1[0]=='-')
{
s1.erase(0,1);
flag1=1;
}
if(s2[0]=='-')
{
s2.erase(0,1);
flag2=1;
}
if(s3[0]=='-')
{
s3.erase(0,1);
flag3=1;
}
while(s1[0]=='0'&&s1.size()!=1)
{
s1.erase(0,1);
}
while(s2[0]=='0'&&s2.size()!=1)
{
s2.erase(0,1);
}
while(s3[0]=='0'&&s3.size()!=1)
{
s3.erase(0,1);
}
string ans;
printf("Case #%d: ",i);
if(f(s2,s1))
{
ans=cal(s2,flag2,s1,flag1);
if(flag2==0&&flag3==1)
{
printf("true\n");
}
else if(flag2==0&&flag3==0)
{
if(f(ans,s3))
{
printf("true\n");
}
else
{
printf("false\n");
}
}
else if(flag2==1&&flag3==0)
{
printf("false\n");
}
else
{
if(f(s3,ans))
{
printf("true\n");
}
else
{
printf("false\n");
}
}
}
else //s1>=s2
{
ans=cal(s1,flag1,s2,flag2);
if(flag1==0&&flag3==1)
{
if(ans==s3&&ans=="0")
{
//cout<<22233<<endl;
printf("false\n");
}
else
printf("true\n");
}
else if(flag1==0&&flag3==0)
{
if(f(ans,s3))
{
printf("true\n");
}
else
{
printf("false\n");
}
}
else if(flag1==1&&flag3==0)
{
printf("false\n");
}
else
{
if(f(s3,ans))
{
printf("true\n");
}
else
{
printf("false\n");
}
}
}
}
}
本文详细介绍了一种处理高精度加法的算法实现方法,针对不同符号情况进行了特殊处理,并通过示例代码展示了如何解决A+B的高精度计算问题。
1492

被折叠的 条评论
为什么被折叠?



