高精度加法
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;
}