序:高精度的问题引入
你所需要解决的问题中,所需计算的数字已经非常大,不能再用基本数据类型存储了。
数字的输入和存储:可以用数组和字符串进行处理。字符串的优点是,能方便的进行输入输出。数组的优点是,存储的是数的形式,可以直接进行运算。结合两者的优点:
用字符串进行输入,经过转换,放入数组里,再用数组进行运算处理。
注:将数字输入到字符串中,再从字符串存入数组时,需要有有一个逆置的过程。
一、高精度加法
代码实现如下:
#include <iostream>
using namespace std;
#include <string>
string x, y;
int a[100000], b[100000], c[100000];
int main()
{
int la, lb, lc;
cin >> x >> y; //用字符串输入
la = x.length();
lb = y.length();
lc = max(la, lb);
for (int i = 0; i < la; i++)
{
a[la - i] = x[i] - '0'; //存入数组a[]里
}
for (int i = 0; i < lb; i++)
{
b[lb - i] = y[i] - '0'; //存入数组b[]里
}
int temp=0;
for (int i = 1; i <= lc; i++) //最重要的运算环节
{
c[i] += a[i] + b[i];
c[i + 1] = c[i] / 10;
c[i] = c[i] % 10;
temp = c[i + 1];
}
int m;
if (temp == 0) m = lc; //对加法进位的处理
else m = lc + 1;
for (; m > 0; m--)
{
cout << c[m];
}
return 0;
}
训练题目:洛谷题号 P1601 A+B Problem(高精)
二、高精度减法
代码实现如下:
#include <iostream>
using namespace std;
#include <string>
int a[100000], b[100000], c[100000];
string x, y;
int main()
{
cin >> x >> y; //存入字符串
int la = x.length();
int lb = y.length();
if (la < lb || (lb == la && x < y)) //判断结果是否为负数
{
swap(x, y); //使x中的数字永远大于y中的
swap(la, lb);
cout << "-";
}
for (int i = 0; i < la; i++)
{
a[la - i] = x[i] - '0';
}
for (int i = 0; i < lb; i++)
{
b[lb - i] = y[i] - '0';
}
for (int i = 1; i <= la; i++) //最重要的运算环节
{
if (a[i] < b[i])
{
a[i] += 10;
a[i + 1]--;
}
c[i] = a[i] - b[i];
}
while (c[la]==0 && la>1) la--; //对最高位消为0的情况进行处理
for (int i = la; i >= 1; i--)
{
cout << c[i];
}
return 0;
}
训练题目:洛谷题号 P2142 高精度减法
三、高精度乘法
代码实现如下:
#include <iostream>
#include <string>
using namespace std;
int a[100000], b[100000], c[100000], la, lb, lc;
string x, y;
int main()
{
cin >> x >> y;
la = x.length(); lb = y.length(); //存入字符串
for (int i = 0; i < la; i++)
{
a[la - i] = x[i] - '0';
}
for (int i = 0; i < lb; i++)
{
b[lb - i] = y[i] - '0';
}
for (int i = 1; i <= lb; i++) //最重要的运算环节
{
for (int j = 1; j <= la; j++)
{
c[i + j - 1] += b[i] * a[j];
c[i + j] += c[i + j - 1] / 10;
c[i + j - 1] = c[i + j - 1] % 10;
}
}
lc = la + lb; //对结果的位数进行猜测
while (c[lc] == 0 && lc > 1) lc--;//对位数过多,最高位为0的处理
for (int i = lc; i >= 1; i--)
{
cout << c[i];
}
return 0;
}
训练题目:洛谷题号 P1303 A*B Problem
四、高精度除法
高精度的除法可以分为两类:高精度除以低精度,高精度除以低精度。
高精度除以低精度的代码实现如下:
#include <iostream>
#include <string>
using namespace std;
int a[10000000], c[10000000];
long long b, la, temp;
string x;
int main()
{
int m = 0;
cin >> x >> b;
la = x.length();
for (int i = 0; i < la; i++)
a[i] = x[i] - '0';
for (int i = 0; i < la; i++) //最重要的运算环节
{
c[i] = (temp * 10 + a[i]) / b;
temp = (a[i] + temp * 10) % b;
}
while (c[m] == 0 && m < la-1 ) m++;
for (; m < la; m++)
{
cout << c[m];
}
return 0;
}
训练题目:洛谷题号 P1480 A/B Problem
高精度除以高精度的代码,还未学完。。。╮( ̄▽ ̄)╭
五、进制的转化
在高精度中的最重要的运算环节中,稍加改动就可以变成进制的转化器。
代码实现如下:
#include <iostream>
#include <string>
using namespace std;
int a[10000000], c[10000000];
long long b, la, temp;
string x;
int main()
{
int m = 0;
cin >> x >> b;
la = x.length();
for (int i = 0; i < la; i++)
a[i] = x[i] - '0';
for (int i = 0; i < la; i++) //这,这,这,就在这
{
c[i] = (temp * 10 + a[i]) / b;
temp = (a[i] + temp * 10) % b;
cout << c[i];
}
while (c[m] == 0 && m < la-1 ) m++;
for (; m < la; m++)
{
cout << c[m];
}
return 0;
}
训练题目: 洛谷题号 P1604 B进制星球