高精度加减乘除

文章详细描述了如何使用高精度算法实现加法、减法、乘法和除法的C++代码,包括读取字符串、存储数组、逐位操作以及结果处理。主要涉及了字符串转换、数组操作和模拟数学运算的过程。
摘要由CSDN通过智能技术生成

高精度加法

P1601 A+B Problem(高精)
解题思路:
1、定义常量 N,表示数组大小,即最大位数。
2、声明全局变量 A[N], B[N], C[N] 分别代表两个加数和结果,以及变量 la, lb, lc 分别表示两个加数和结果的长度。
3、定义函数 add,用于实现高精度加法。在循环中,先判断加数是否有剩余位数,然后将对应位上的数相加,并处理进位和存余。最后,如果最高位有进位,增加结果的长度。
4、读取两个字符串形式的数字 a 和 b。
5、计算两个加数的长度 la 和 lb,并取较大值作为结果的长度 lc。
6、将字符串形式的数字倒序存入整型数组 A 和 B 中。
7、调用 add 函数进行高精度加法运算。
8、逆序输出结果数组 C 中的数值。

#include <iostream>
#include <string>

using namespace std;

// 高精度加法 
// 字符串形式录入
// 反转存入整型数组
// 相加,进位,存余
// 逆序输出 
const int N = 505;// 10^500次方有501位数
int A[N],B[N],C[N];
int la,lb,lc;

void add(int* A,int* B,int* C)
{
	for(int i=0;i<lc;i++)
	{
		if(la>0) C[i]+=A[i];
		if(lb>0) C[i]+=B[i];
		
		C[i+1]=C[i]/10;
		C[i]%=10;
	}
	if(C[lc]) lc++;
}
int main(void)
{
	string a,b;
	cin>>a>>b;
	la=a.size(),lb=b.size(),lc=max(la,lb);
	for(int i=la-1;i>=0;--i) A[la-1-i]=a[i]-'0';
	for(int i=lb-1;i>=0;--i) B[lb-1-i]=b[i]-'0';
	add(A,B,C);
	for(int i=lc-1;i>=0;--i) cout << C[i];
	return 0;
}

高精度减法

P2142 高精度减法
解题思路:
1、高精度减法
2、字符串形式读入
3、反转存入数组
4、两数组作比较,是否输出’-',并交换两数组
5、求差,借位,存差,
6、考虑高位出现多个0的情况,去0

#include <iostream>
#include <string>

using namespace std;

// 高精度减法
// 字符串形式读入
// 反转存入数组
// 两数组作比较,是否输出'-',并交换两数组 
// 求差,借位,存差,考虑高位出现多个0的情况

const int N =30000;
int A[N],B[N],C[N];
int la,lb,lc;
bool cmp(int* A,int* B)
{
	if(la!=lb)
		return la<lb;
	for(int i=la;i>=0;--i) 
	{
		if(A[i]!=B[i])
			return A[i]<B[i];
	}
	return false;
}
void sub(int* A,int* B,int* C)
{
	for(int i=0;i<lc;i++)
	{
		if(A[i]<B[i])
		{
			A[i+1]--;
			A[i]+=10;
		}
		C[i]=A[i]-B[i];
	}
	while(lc>1 && C[lc-1]==0) lc--;// 去0 
}
int main()
{
	string a,b;
	cin>>a>>b;
	la=a.size(),lb=b.size(),lc=max(la,lb);// 取两个加数长度的最大值
	for(int i=la-1;i>=0;--i) A[la-1-i]=a[i]-'0';
	for(int i=lb-1;i>=0;--i) B[lb-1-i]=b[i]-'0';
	if(cmp(A,B))// 如果a小于b为真 
	{
		cout << "-";
		swap(A,B);
	}
	sub(A,B,C);
	for(int i=lc-1;i>=0;--i) cout << C[i];
	return 0;
 } 

高精度乘法

P1303 A*B Problem
解题思路:
1、字符串形式读入
2、反转存入数组
3、从低位到高位,模拟乘法算式,(累加)求积(下标间关系),(累加)进位(下标),存余(下标)
4、如果结果的长度小于lc,数组在全局区默认初始化为0,去多余0

#include <iostream>
#include <string>

using namespace std;

// 字符串形式读入
// 反转存入数组
// 从低位到高位,模拟乘法算式,(累加)求积(下标间关系),(累加)进位(下标),存余(下标) 
// 去0 
const int N = 3000;// 10^2000长度为2017 
int A[N],B[N],C[N];
int la,lb,lc;
void mul(int* A,int* B,int* C)
{
	for(int i=0;i<la;i++)
	{
		for(int j=0;j<lb;j++)
		{
			C[i+j]+=A[i]*B[j];// 求乘 
			C[i+j+1]+=C[i+j]/10;// 进位 
			C[i+j]%=10;// 存余 
		}
	}
	// 结果的长度小于lc,数组在全局区默认初始化为0,去多余0 
	while(lc>1 && C[lc-1]==0) lc--; 
}
int main()
{
	string a,b;
	cin>> a >> b;
	la=a.size(),lb=b.size(),lc=la+lb;// 两数乘积的长度最大为两数长度和
	for(int i=la-1;i>=0;--i) A[la-1-i]=a[i]-'0';
	for(int i=lb-1;i>=0;--i) B[lb-1-i]=b[i]-'0';
	
	mul(A,B,C);
	for(int i=lc-1;i>=0;--i) cout << C[i]; 
	return 0;
}


高精度除法

P1480 A/B Problem
解题思路:
1、字符串形式读入
2、反转存入数组
3、从高位到低位,模拟除法算式,找除数,作除法,存商,留余数
4、去除高位多余的0
5、逆序输出

#include <iostream>
#include <string>

using namespace std;

// 字符串形式读入
// 反转存入数组
// 从高位到低位,模拟除法算式,找除数,作除法,存商,留余数 
// 去除高位多余的0 
// 逆序输出 

const int N = 9999;
int A[N],b,C[N];
int la,lc;
void div(int* A,int b,int* C)
{
	long long x=0;
	for(int i=la-1;i>=0;i--)
	{
		x=x*10+A[i];
		C[i]=x/b;
		x%=b;
	}
	while(lc>1 && C[lc-1]==0) lc--;
}
int main()
{
	string a;
	cin>>a>>b;
	la=lc=a.size();// 商的长度最长为除数的长度 
	for(int i=la-1;i>=0;--i) A[la-1-i]=a[i]-'0';
	div(A,b,C);
	for(int i=lc-1;i>=0;--i) cout << C[i]; 
	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值