目录
输入
输入数时用数组存储,将每一位数储存进数组
string a;
int na[100001];
void lay(string a) {
int len1 = a.size();
for (int i = 0;i < len1;i++) {
na[len1 - 1 - i] = a[i] - '0';
}
}
关于进位
加法
na[i] += nb[i] + carry;//每一位相加,carry表示上一位数加过来的进位
carry= na[i] / 10;//算出这一位数的进位
na[i] %= 10;
减法
int lmax = max(len1, len2);//获取最大长度
for (int i = 0;i < lmax;i++)
{
if (na[i] < nb[i])//如果该位数B的更大,则向后一位数借个1
{
na[i + 1]--;
na[i] += 10;
}
na[i] -=nb[i];
}
while (na[lmax-1] == 0 && lmax > 1) lmax--;//如果最后面还存在借位,则需减低最大长度
//注意这里要用while 如果最高位存在多个0的话就要一直减低最大长度
乘法
int lmax = len1+ len2;//获取最大长度 注意这里是+,与前面的不同
for (int i = 0;i <len1;i++)
for (int j = 0;j < len2;j++)
{
c[i + j ] += na[i] * nb[j];//乘法对应的表达式
c[i + j] += c[i + j - 1] / 10;
c[i + j - 1] %= 10;
}
while (c[lmax-1] == 0 && lmax > 1) lmax--;
除法
c[i] = (x * 10 + na[i]) / b;
x = (x * 10 + na[i]) % b;
输出
关于输出 由于数组是从低位开始储存的,所以我们要从高位开始加至新的字符串(此处也可以采取直接从高位输出的方式)
for (int i = lmax - 1;i >= 0;i--)c += na[i] + '0';//从高位开始加至新的字符串
cout << c << endl;//输出字符串
高精度加法
例题洛谷P1601P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
AC代码(逐句逐段分析)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string a;
int na[100001], nb[100001];
int main() {
string a, b, c;cin >> a >> b;//将a,b以字符串的形式输入
int len1 = a.size(), len2 = b.size();//利用size()函数获取a,b的长度
for (int i = 0;i < len1;i++) {
na[len1 - 1 - i] = a[i] - '0';
}
for (int i = 0;i < len2;i++) {
nb[len2 - 1 - i] = b[i] - '0';
}
//将每一位数储存进数组中
int lmax = max(len1, len2);//获取最大长度
int carry = 0;//初始化进位为0
//将每一位都相加,并算出进位加到后一位数中
for (int i = 0;i < lmax;i++) {
na[i] += nb[i] + carry;//每一位相加,carry表示上一位数加过来的进位
carry= na[i] / 10;//算出这一位数的进位
na[i] %= 10;
}
if (carry > 0)na[lmax++] = carry;//如果最高位有进位,最大数位+1
for (int i = lmax - 1;i >= 0;i--)c += na[i] + '0';//从高位开始加至新的字符串
cout << c << endl;//输出字符串
}
AC代码
#include<iostream>
#include<string>
#include<algorithm>
const int L = 1100;
using namespace std;
int main() {
int t;cin >> t;
for (int j = 1;j <= t;j++) {
string a, b;cin >> a >> b;string c;
int na[L] = { 0 }, nb[L] = { 0 };
cout << "Case " << j << ":" << endl;
int len1 = a.length(), len2 = b.length();
for (int i = 0;i < len1;i++)na[len1 - 1 - i] = a[i] - '0';
for (int i = 0;i < len2;i++)nb[len2 - 1 - i] = b[i] - '0';
int lmax = len1 > len2 ? len1 : len2;
for (int i = 0;i < lmax;i++) {
na[i] += nb[i];
na[i + 1] += na[i] / 10;
na[i] %= 10;
}
if (na[lmax])lmax++;
for (int i = lmax - 1;i >= 0;i--)c += na[i] + '0';
cout << a << " + " << b << " = " << c << endl;
if(j!=t)
cout << endl;
}
}
高精度减法
例题 洛谷P2142P2142 高精度减法 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
AC代码(逐句逐段分析)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string a;
int na[100001], nb[100001];
bool judge(string a, string b) {
int u =a.size(), v = b.size();
if (u != v) return u > v;
/*
如果u>v,那么肯定有s1>s2,返回ture
如果u==v,那么就进行下面的比较
*/
for (int i = 0;i < u;i++)
{
if (a[i] != b[i]) return a[i] > b[i];
}
return true;
}
int main() {
string a, b, c;cin >> a >> b;//将a,b以字符串的形式输入
if (!judge(a, b)) {
string c = a;
a = b;
b = c;
cout << "-";
}//如果a<b则输出负数 ,同时改变a,b位置
int len1 = a.size(), len2 = b.size();//利用size()函数获取a,b的长度
for (int i = 0;i < len1;i++) {
na[len1 - 1 - i] = a[i] - '0';
}
for (int i = 0;i < len2;i++) {
nb[len2 - 1 - i] = b[i] - '0';
}
//将每一位数储存进数组中
int lmax = max(len1, len2);//获取最大长度
for (int i = 0;i < lmax;i++)
{
if (na[i] < nb[i])//如果该位数B的更大,则向后一位数借个1
{
na[i + 1]--;
na[i] += 10;
}
na[i] -=nb[i];
}
while (na[lmax-1] == 0 && lmax > 1) lmax--;//如果最后面还存在借位,则需减低最大长度
//注意这里要用while 如果最高位存在多个0的话就要一直减低最大长度
for (int i = lmax - 1;i >= 0;i--)cout << na[i];//从高位开始输出
}
高精度乘法
例题
洛谷P1303P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
AC代码(逐句逐段分析)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string a;
int na[100001], nb[100001],c[100001];
int main() {
string a, b;cin >> a >> b;//将a,b以字符串的形式输入
int len1 = a.size(), len2 = b.size();//利用size()函数获取a,b的长度
for (int i = 0;i < len1;i++) {
na[len1 - 1 - i] = a[i] - '0';
}
for (int i = 0;i < len2;i++) {
nb[len2 - 1 - i] = b[i] - '0';
}
//将每一位数储存进数组中
int lmax = len1+ len2;//获取最大长度
for (int i = 0;i <len1;i++)
for (int j = 0;j < len2;j++)
{
c[i + j ] += na[i] * nb[j];//乘法对应的表达式
c[i + j] += c[i + j - 1] / 10;
c[i + j - 1] %= 10;
}
while (c[lmax-1] == 0 && lmax > 1) lmax--;
for (int i = lmax - 1;i >= 0;i--)cout << c[i];//从高位开始输出
}
高精度除法
高精度除以低精度
例题
洛谷P1480P1480 A/B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
AC代码(逐句逐段分析)
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int na[100001], nb[100001], c[100001];
int main() {
string a;ll b,x=0;
cin >> a >> b;//将a,b以字符串的形式输入
int lmax = a.size();//利用size()函数获取a的长度
for (int i = 0;i < lmax;i++) {
na[i] = a[i] - '0';
}
//将每一位数储存进数组中 不用转置
for (int i = 0;i < lmax;i++)
{
c[i] = (x * 10 + na[i]) / b;
x = (x * 10 + na[i]) % b;
}
int lmin = 0;
while (c[lmin] == 0 && lmin <= lmax) lmin++;
for (int i = lmin;i < lmax;i++)
{
cout << c[i];
}
}