高精度篇————
减法

蒟蒻呢,第二次写博客
其实吧,我也才六年级
虽然学校里的信息奥赛解散了
但是,我依然喜欢写代码!
我才不会告诉你我是想打游戏
迈过第一道坎(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;
}

感谢大家的支持,蒟蒻会继续努力的!
٩(๑>◡<๑)۶

相关文章: