高精度篇————
减法
蒟蒻呢,第二次写博客
其实吧,我也才六年级
虽然学校里的信息奥赛解散了
但是,我依然喜欢写代码!
(我才不会告诉你我是想打游戏 )
迈过第一道坎(https://blog.csdn.net/Grated_Konny_lxy/article/details/87989848)
后面的也就不难了
赶紧切入主题
首先,公布目录
1.减法原理
2.代码实现
不过提前说明一下,因为和高精度加法类似,所以导致博客过短(`・ω・´)
1.减法原理
咱依然用一道例题来引出今天的主题:
100000000000000000000000000000-99999999999999999999999999999=?
#include<iostream>
using namespace std;
int main()
{
long long a,b;
cin>>a>>b;
cout<<a-b<<endl;
return 0;
}
虽然这道题我们人肉算起来很简单,但是要拿这个代码运行的话——
很明显我刚输入100000000000000000000000000000,就莫名其妙地出了一串数字
所以偶们要用高精度滴
和上回一样,把它转换成竖式
100000000000000000000000000000
-99999999999999999999999999999
—————————————————
当数组一个一个相减时,会出现负数
不过不要怕,int是整数和负数
然后模拟退位,如果当前数位是负数,就+10,然后下一位–
最后把数组倒过来就OK了
2.代码实现
前面代码一样,把字符串转化为数组:
string sub(string s1,string s2)
{
int a[10005]={0},b[10005]={0};
int s[20005]={0};
int l1,l2,lx;
int i,w=0;
string ans="";
l1=s1.size();
l2=s2.size();
lx=max(l1,l2)+1;
for(i=0;i<l1;i++) a[i]=int(s1[l1-i-1]-'0');
for(i=0;i<l2;i++) b[i]=int(s2[l2-i-1]-'0');
紧接着要把下面循环正反改一下:
for(i=0;i<lx;i++) s[i]=a[i]-b[i];
然后把整理进位变成判断退位:
for(i=0;i<lx;i++)
{
if(s[i]<0) //退位ヽ(・ω・´メ)
{
s[i+1]--;
s[i]+=10;
}
if(s[i]!=0) w=i;
}
最后把数组倒过来返回就大功告成啦!
贴一下整体代码
#include<iostream>
#include<cmath>
using namespace std;
string sub(string s1,string s2)
{
int a[10005]={0},b[10005]={0};
int s[20005]={0};
int l1,l2,lx;
int i,w=0;
string ans="";
l1=s1.size();
l2=s2.size();
lx=max(l1,l2);
for(i=0;i<l1;i++) a[i]=int(s1[l1-i-1]-'0');
for(i=0;i<l2;i++) b[i]=int(s2[l2-i-1]-'0');
for(i=0;i<lx;i++) s[i]=a[i]-b[i];
for(i=0;i<lx;i++)
{
if(s[i]<0)
{
s[i+1]--;
s[i]+=10;
}
if(s[i]!=0) w=i;
}
for(i=0;i<=w;i++) ans=char(s[i]+'0')+ans;
return ans;
}
int main()
{
string v1,v2;
cin>>v1>>v2;
cout<<sub(v1,v2)<<endl;
return 0;
}
感谢大家的支持,蒟蒻会继续努力的!
٩(๑>◡<๑)۶