由于c++不能进行位数过高的数据运算,如果超过数量级,就需要使用高精度算法。通过char或string形式模拟数字输入,然后将每个字符转换到数组中,通过数组进行计算。
Int 占4个字节,范围[-231,231-1] ,转换位10进制数量级为10^9
Long long 占8个字节,范围[-263,263-1] ,转换位10进制数量级为10^18 。
高精度加法
原理:
(1)输入字符str_a=3125 ,str_b=369。
(2)将str_a 倒叙存入数组a[4]={5,2,1,3}, str_b 倒叙存入数组b[3]={9,6,3}
(3)数组a和数组b从第0位开始求和,如果和大于10就进位。
int len = max(a_len , b_len);
int x = 0; //大于10时的进位
for ( int i = 0; i <len ;i ++)
{
int sum = a[i] + b[i] + x;
c[i] = sum % 10;
x= sum / 10;
}
描述
输入两个正整数(数位可能不同也许存在进位),计算并输出数字和。
输入描述
共2行。每行一个正整数。(10<=位数<=2000)
输出描述
一个数字。表示数字和。
样例输入
66666666666666666666
5555555512
样例输出
66666666672222222178
代码实现
#include <bits/stdc++.h>
using namespace std;
int main() {
string str_a, str_b ; //输入的正整数
int a[2000]={},b[2000]={},c[2001]={}; //str_a转化至数组a ,str_b转化至数组b
cin >> str_a >> str_b;
int a_len = str_a.length();
for (int i = 0; i <a_len; i++)
{
a[a_len-1-i]=str_a[i]-'0';
}
int b_len = str_b.length();
for (int i = 0; i <b_len; i++)
{
b[b_len-1-i]=str_b[i]-'0';
}
int len = max(a_len , b_len);
int x = 0; //大于10时的进位
for ( int i = 0; i <len ;i ++)
{
int sum = 0;
sum = a[i] + b[i] + x;
c[i] = sum % 10;
x= sum / 10;
}
if (x > 0)
{
cout << x;
}
for (int i = len-1; i>=0 ;i--)
{
cout << c[i];
}
return 0;
}
高精度减法
原理:
(1)与加法不同,高精度减法是借位,如果当前位不够减从高位借位。
int len =max(a_len , b_len);
for ( int i = 0; i <len ;i ++)
{
if(a[i]-b[i]<0)
{
a[i+1]--;
a[i]+= 10 ;
}
c[i] = a[i] - b[i] ;
}
(2)得到得差有可能会有多个0,需要去掉。如:8891-8805从个位开始减,输出时按照从高位开始输出:0086,需要将86前面的0去掉。
while (c[len-1]==0 && len > 1)
{
len--;
}
描述
输入两个数位相同的正整数,计算并输出两个数的差,第一个整数大于第二个整数,但是可能存在第一个正整数某一位小于第二个正整数对应位。
输入描述
共2行。每行一个正整数。(10<=位数<=2000)
输出描述
一个数字。表示两个正整数的差。
样例输入
88888888886666666666
44444444443333333789
样例输出
44444444443333332877
代码实现
#include <bits/stdc++.h>
using namespace std;
int main() {
string str_a, str_b ; //输入的正整数
int a[2000]={},b[2000]={},c[2001]={}; //str_a转化至数组a ,str_b转化至数组b
cin >> str_a >> str_b;
int a_len = str_a.length();
for (int i = 0; i <a_len; i++)
{
a[a_len-1-i]=str_a[i]-'0';
}
int b_len = str_b.length();
for (int i = 0; i <b_len; i++)
{
b[b_len-1-i]=str_b[i]-'0';
}
int len =max(a_len , b_len);
for ( int i = 0; i <len ;i ++)
{
if(a[i]-b[i]<0)
{
a[i+1]--;
a[i]+= 10 ;
}
c[i] = a[i] - b[i] ;
}
while (c[len-1]==0 && len > 1)
{
len--;
}
for (int i = len-1; i>=0 ;i--)
{
cout << c[i];
}
return 0;
}