高精度模拟

一.高精度加法

  1. 将两数的位数加’0’对齐
  2. 从个位开始相加,考虑进位
#include
#include
#include
using namespace std;
string add(string a,string b)
{
	int lena=a.length(),lenb=b.length();
	//将a,b加‘0’对齐。如a=123,b=56789。补齐后a=00123
	if(lena=0;i--)
	{
		tmp+=(a[i]-'0')+(b[i]-'0');  //28
		ans[i]=tmp%10+'0';			 //ans[i]=8;
		tmp/=10; 					//tmp=2
	 } 
	 //如果有进位
	 if(tmp)	{ans=char(tmp+'0')+ans;}
	 return ans;
}
int main()
{
	string a,b;
	cin>>a>>b;
	cout<

注:

  • for()循环从 i=len-1开始,因为后面代表个位
  • ans[i]=tmp%10+‘0’ 记得加字符’0’
  • char(tmp+‘0’) 记得用char强制化,因为(tmp+‘0’)仍为int型

二.高精度减法

  1. 将两数的位数加’0’对齐
  2. 从个位开始相减,考虑借位
  3. 最终答案去掉多余的0
#include
#include
#include
using namespace std;

 //只讨论a>b的情况
string sub(string a,string b)
{
	int lena=a.length(),lenb=b.length();
	//将a,b位数加'0'对齐
	for(int i=1;i<=lena-lenb;i++)
		b='0'+b;
	lenb=lena;
	int len=max(lena,lenb);	
	string ans(len,'0');
	
	//从个位开始
	for(int i=lena;i>=0;i--)
	{
		if(a[i]>=b[i])
			ans[i] = a[i]-b[i]+'0';
		//借位
		else
		{
			a[i-1] -= 1;
			ans[i] = a[i]-b[i]+10+'0';	
		}
	} 
	if(ans.find_first_not_of('0')!=-1)
		return  ans.substr(ans.find_first_not_of('0'));
	else
		return "0";
	
}
int main()
{
	string a,b;
	cin>>a>>b;
	cout<

注:

  • sub()函数中,ans可能为0,若如此find_first_not_of(‘0’)函数为-1。调用ans.sub()会出错。因此要分情况。
  • 该sub()函数中只讨论a>b;若ab的情况写。

你可能感兴趣的:(高精度模拟)