华师一附中OI组
标题:
P2142 高精度减法
[打印本页]
作者:
admin
时间:
2018-7-3 16:40
标题:
P2142 高精度减法
https://www.luogu.org/problemnew/show/P2142
输入输出格式
输入格式:
两个整数a,b(第二个可能比第一个大)
输出格式:
结果(是负数要输出负号)
输入输出样例
输入样例#1:
2
1
输出样例#1:
1
说明
20%数据a,b在long long范围内
100%数据0<a,b<=10的10000次方
作者:
admin
时间:
2018-7-11 20:21
#include <iostream>
using namespace std;
string s1,s2,s3;
int l1,l2,i,j,k,x1,x2,x3;
char ch3;
int main()
{
cin>>s1>>s2;
l1=s1.size();
l2=s2.size();
if ((l1<l2)||(l1==l2 && s1<s2))
{
swap(s1,s2); ///短的放后面
swap(l1,l2);
cout<<'-';
}
///cout<<s1<<endl<<s2<<endl;///检查
for(i=1; i<=l1-l2; i++) s2='0'+s2;
///cout<<s1<<endl<<s2<<endl;///再检查
///开始加
s3="";
j=0;
for (i=l1-1; i>=0; i--) ///从右往左
{
x1=s1[i]-'0';///把第i位的字符转成数字
x2=s2[i]-'0';
x3=x1-x2-j;///不要忘记了进位
if (x3<0) ///进位处理
{
x3=x3+10;
j=1;
}
else j=0;
ch3=x3+'0';///数字转字符
s3=ch3+s3;///接在s3前面
}
while (s3[0]=='0' && s3.size()>1) s3.erase(0,1) ;
cout<<s3;
return 0;
}
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-7-18 17:57
#include<iostream>
using namespace std;
int a[10010],b[10010],ans[10010];
int n;
string s1,s2;
bool flag;
void zs()
{
int i;
for(i=1;i<=s1.size();i++)
ans[i]=a[i]-b[i];
for(i=1;i<=s1.size();i++)
{
while(ans[i]<0)
{
ans[i]+=10;
ans[i+1]--;
}
}
for(i=s1.size();ans[i]==0;i--)if(i==0)break;
n=i;if(n==0)n++;
for(int i=n;i>=1;i--)
cout<<ans[i];
return;
}
void fs()
{
int i;
for(i=1;i<=s2.size();i++)
ans[i]=b[i]-a[i];
for(i=1;i<=s2.size();i++)
{
while(ans[i]<0)
{
ans[i]+=10;
ans[i+1]--;
}
}
for(i=s2.size();ans[i]==0;i--)continue;
n=i;cout<<"-";
for(int i=n;i>=1;i--)
cout<<ans[i];
return;
}
int main()
{
cin>>s1;
cin>>s2;
for(int i=0;i<s1.size();i++)
a[s1.size()-i]=s1[i]-'0';
for(int i=0;i<s2.size();i++)
b[s2.size()-i]=s2[i]-'0';
if(s1.size()<s2.size())
fs();
if(s1.size()>s2.size())
zs();
if(s1.size()==s2.size())
{
for(int i=1;i<s1.size();i++)
{
if(a[i]>b[i])
{
flag=0;
break;
}
if(a[i]<b[i])
{
flag=1;
break;
}
}
if(flag==0)zs();
else fs();
}
/*for(int i=1;i<=s1.size();i++)
cout<<a[i];
cout<<endl;
for(int i=1;i<=s2.size();i++)
cout<<b[i];*/
return 0;
}
复制代码
作者:
GTR
时间:
2018-7-19 22:13
#include<iostream>
using namespace std;
string s1,s2,s3;
int l1,l2,i,j,k,x3;
int main()
{
cin>>s1>>s2;
bool b1=s1.size()<s2.size();
bool b2=(s1.size()==s2.size()&&s1<s2);
if((b1||b2))
{
swap(s1,s2);
cout<<'-';
}
l1=s1.size();
l2=s2.size();
for(i=1; i<=l1-l2; i++) s2='0'+s2;
j=0;
s3="";
for(i=l1-1; i>=0; i--)
{
x3=s1[i]-s2[i]-j;
if(x3<0)
{
x3+=10;
j=1;
}
else j=0;
s3=char(x3+'0')+s3;
}
while(s3[0]=='0'&&s3.size()>1)
s3.erase(0,1);
cout<<s3;
return 0;
}
复制代码
作者:
universehyf
时间:
2018-7-23 23:32
高精度减法常规,用时1h,不好,--顺手写成了++
#include<iostream>
using namespace std;
string n,n1,n2;
int a[10010],b[10010],c[10010],la,lb,lc,i;
int bj(string x,string y)
{
for(i=0;i<=la;i++)
{
if(x[i]>y[i]) return 0;
if(x[i]<y[i]) return 1;
}
return 0;
}
int main()
{
cin>>n1>>n2;
la=n1.size();lb=n2.size();
if(la<lb)
{swap(n1,n2);swap(la,lb);cout<<'-';}
else if(la==lb&&bj(n1,n2))
{swap(n1,n2);swap(la,lb);cout<<'-';}
if(la>lb) for(i=lb;i<la;i++) n2=n2+'0';
for(i=0;i<=la-1;i++) a[la-i]=n1[i]-'0';
for(i=0;i<=lb-1;i++) b[lb-i]=n2[i]-'0';
i=1;while(i<=la)
{
if(a[i]<b[i]){a[i]+=10;a[i+1]--;}
c[i]=a[i]-b[i];i++;
}
lc=i;
while(c[lc]==0&&lc>1) lc--;
for(i=lc;i>=1;i--) cout<<c[i];
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-8-25 17:47
#include<iostream>
using namespace std;
string s1,s2;
int a[10005],b[10005],c[10005],l1,l2;
int main()
{
cin>>s1>>s2;
l1=s1.size();
l2=s2.size();
if(l1<l2||(l1==l2&&s1<s2))
{
cout<<'-';
swap(s1,s2);
swap(l1,l2);
}
int mx=max(l1,l2);
for(int i=1;i<=l1;i++)a[i]=s1[l1-i]-'0';
for(int i=1;i<=l2;i++)b[i]=s2[l2-i]-'0';
for(int i=1;i<=mx;i++)
{
c[i]+=a[i]-b[i];
c[i+1]--;
c[i]+=10;
c[i+1]+=c[i]/10;
c[i]%=10;
}
int l=mx+1;
while(l>1&&!c[l])l--;
for(int i=l;i>=1;i--)cout<<c[i];
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2