高进度算法
适用情况
int 10的9次方数量级
lomg long 10的18次方数量级
对于高精度数采用高精度算法解决
算法核心:【竖式加法】
高精度加法
解决方案:用数组模拟高精度
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
完整代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int la,lb,lc;
int a[500]={0},b[500]={0},c[501]={0};
string s1,s2;
cin>>s1>>s2;
la=s1.length();
lb=s2.length();
lc=max(la,lb)+1;
for(int i=0;i<la;i++)
a[i]=s1[la-1-i]-'0';
for(int i=0;i<lb;i++)
b[i]=s2[lb-1-i]-'0';
for(int i=0;i<lc;i++)
{
c[i]+=a[i]+b[i];
c[i+1]=c[i]/10;
c[i]=c[i]%10;
}
if(c[lc-1]==0&&lc>1) \\消除前置0
lc--;
for(int i=lc-1;i>=0;i--)
cout<<c[i];
return 0;
}
高精度减法
要点:
- 如果a<b,则需要交换a与b。
- 如果a[i]<b[i],需要高位借一当十使用。
if(a[i]<b[i])
{
a[i+1]--;
a[i]=a[i]+10;
}
c[i]=a[i]-b[i];
完整代码:
#include<iostream>
#include<string>
using namespace std;
int compare(string a, string b) {
if (a.length() > b.length())
return 1;
else if (a.length() < b.length())
return -1;
else if (a.length() == b.length()) {
if (a > b) return 1;
else if (a < b) return -1;
}
return 0;
} \\用于比较两个字符串转化为数后的大小
int main() {
string a, b, c;
cin >> a >> b;
if (compare(a, b) < 0) {
c = a;
a = b;
b = c;
cout << "-";
}
int la = a.length();
int lb = b.length();
int lc = max(la, lb);
int s1[10090] = {0}, s2[10090] = {0}, s3[10090] = {0};
for (int i = 1; i <= la; i++)
s1[i] = a[la - i] - '0';
for (int i = 1; i <= lb; i++)
s2[i] = b[lb - i] - '0';
for (int i = 1; i <= lc; i++) {
if (s1[i] < s2[i]) {
s1[i + 1]--;
s1[i] += 10;
}\\判断是否借位
s3[i] = s1[i] - s2[i];
}
while (lc > 1 && s3[lc] == 0)
lc--;\\注意用while,减法可能会出现多位前置零
for (int i = lc; i >= 1; i--)
cout << s3[i];
return 0;
}
}
高精度乘法
要点:
- 位置对应:
a[i]*b[i]对应c[i]的位置 - 考虑进位:
c[i+j-1]+=a[i]*b[j]; c[i+j]+=c[i+j-1]/10; c[i+j-1]%10;
完整代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1,s2;
cin>>s1>>s2;
int la,lb,lc;
la=s1.length();
lb=s2.length();
lc=la+lb; \\注意位数
int a[10000]={0},b[10000]={0},c[10000]={0};
for(int i=1;i<=la;i++)
a[i]=s1[la-i]-'0';
for(int i=1;i<=lb;i++)
b[i]=s2[lb-i]-'0';
for(int i=1;i<=la;i++)
{
for(int j=1;j<=lb;j++)
{
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
if(c[lc]==0&&lc>1) lc--; \\注意前置零
for(int i=lc;i>=1;i--)
cout<<c[i];
return 0;
} ```