高精度问题

适用范围:超出long long级别的运算
本质:逆序存储数据,模拟现实运算
为什么要逆序存储:理由很简单,便利于进位和借位。
需要处理好的问题:进位,借位,以及输出问题(容易遗漏项)
加法(要求输入都是正数)

#include<iostream>
#include<string>
#include<math.h>
using namespace std;
int a1[1001];
int a2[1001];
int a3[1001];//用于高精位的加法,处理好进位即可
int main()
{
	
	cin>>s1>>s2;
	for(int i=1;i<=s1.size();i++)//逆序存储
		a1[i]=s1[s1.size()-i]-'0';
	for(int i=1;i<=s2.size();i++)
		a2[i]=s2[s2.size()-i]-'0';
	int p=0;
	for(int i=1;i<=max(s1.size(),s2.size());i++)
	{
		a3[i]+=a1[i]+a2[i];//进位后的a3[i]有值,得+=
		a3[i+1]+=a3[i]/10;//这里也可以是直接等于,不影响
		a3[i]=a3[i]%10;
		p=i;
	}
	while(a3[p+1]>0)//防止漏项
		p++;
	for(int i=p;i>0;i--)
		cout<<a3[i];

减法(前者比后者大)

for(int i=1;i<=max(s1.size(),s2.size());i++)
	{
		a4[i]+=a1[i]-a2[i];
		if(a4[i]<0)
			a4[i]+=10,a4[i+1]=-1;//一次仅能借一位
	}
	int len=max(s1.size(),s2.size());
	while(len>1&&a4[len]==0)//len得要大于1,否则两数相等时没有输出,看下一个循环
		len--;
	for(int i=len;i>0;i--)
	    cout<<a4[i];

改进后的减法(都为正数,但是大小顺序不行)
思想:说白了还是让大减去小的,加个判断条件即可

#include<iostream>
#include<string>
using namespace std;
string s1,s2;
int a1[10005]={0},a2[10005]={0},a3[10005]={0};
bool check(string a,string b)
{
	if(a.size()>b.size())return true;
	else if(a.size()<b.size())return false;
	else return a>=b?true:false;
}
int main()
{
    cin>>s1>>s2;
	if(check(s1,s2))
	{
		for(int i=1;i<=s1.size();i++)
		    a1[i]=s1[s1.size()-i]-'0';
	    for(int i=1;i<=s2.size();i++)
		    a2[i]=s2[s2.size()-i]-'0';
	}
	else
	{
		for(int i=1;i<=s2.size();i++)
		    a1[i]=s2[s2.size()-i]-'0';
	    for(int i=1;i<=s1.size();i++)
		    a2[i]=s1[s1.size()-i]-'0';
	}
	for(int i=1;i<=max(s1.size(),s2.size());i++)
	{
			a3[i]+=a1[i]-a2[i];
			if(a3[i]<0)a3[i]+=10,a3[i+1]=-1;
	}
	int p=max(s1.size(),s2.size());
	while(p>0&&a3[p]==0)p--;
	if(!check(s1,s2))cout<<'-';
	for(int i=p;i>0;i--)
		cout<<a3[i];
		return 0;
}

乘法:
主要思想:双循环实现进位即可
代码如下:

void multiply()
{
	for(int i=1;i<=s1.size();i++)
		for(int j=1;j<=s2.size();j++)
		{
			b[i+j-1]+=a1[i]*a2[j];
			if(b[i+j-1]>=10)
			{
			  b[i+j]+=b[i+j-1]/10;//这里必须为+=,不然可能会覆盖之前的值
			  b[i+j-1]%=10;
			}
		}
		int p=min(s1.size(),s2.size());
	for(int i=p;i<=s1.size()+s2.size();i++)//容易得知,任意大的两正整数相乘的值得位数比小于等于两操作数的位数之和
		if(b[i]>0)p=i;
		for(int i=p;i>0;i--)
			cout<<b[i];

}

除法的部分以后再补充(除法不太常用)
如有错误,欢迎再下方指出
邮箱:2252578955@qq.com

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值