点击查看代码
//高精度算法
//1.先用字符串读入这个数, 然后用数组逆序存储该数的每一位
//(因为数字的加减乘除是从最低位-个位开始计算,逆序存储到数组便可以从下标为0开始计算)
//2.利用数组,模拟加减乘除运算的过程
//⾼精度算法本质上还是模拟算法,⽤代码模拟⼩学列竖式计算加减乘除的过程。
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int a[N], b, c[N];//b[N]
int la, lb, lc;
// ⾼精度加法的模版 - c = a + b;
void add(int c[], int a[], int b[]){
for(int i = 0; i < lc; i++){
c[i] += a[i] + b[i];// 对应位相加,再加上进位
c[i + 1] += c[i] / 10;// 处理进位
c[i] %= 10;// 处理余数
}
if(c[lc]) lc++;// 如果最高位相加后还有进位(比如999+1=1000),结果长度+1
}
//比大小
bool cmp(string &x, string &y){
if(x.size() != y.size()) return x.size() < y.size();
return x < y;
}
// ⾼精度减法的模板 - c = a - b
void sub(int c[], int a[], int b[]){
for(int i = 0; i < lc; i++){
c[i] += a[i] - b[i];// 对应位相减(c[i]初始为0)
if(c[i] < 0){ // 不够减,需要借位
c[i + 1] -= 1; // 向高位借1(高位减1)
c[i] += 10; // 本位加10(比如 3-5 不够减,借位后变成 13-5=8)
}
}
// 去掉结果前面的无效0(比如 1000-999=1,结果数组里是[1,0,0,0],需要把末尾的0去掉)
while(lc > 1 && c[lc - 1] == 0) lc--;
}
// ⾼精度乘法的模版 - c = a * b
void mul(int c[], int a[], int b[]){
// ⽆进位相乘,然后相加
for(int i = 0; i < la; i++){
for(int j = 0; j < lb; j++){
c[i + j] += a[i] * b[j];
}
}
// 处理进位
for(int i = 0; i < lc; i++){
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
// 处理前导零
while(lc > 1 && c[lc - 1] == 0) lc--;
}
// ⾼精度除法的模板 - c = a / b (⾼精度 / 低精度)
void div(int c[],int a[],int b){
long long t = 0;// 标记每次除完之后的余数
for(int i = la - 1; i >= 0; i--){
t = t * 10 + a[i];// 拼接当前位(余数*10 + 当前位数字)
c[i] = t / b;// 计算当前位的商
t %= b; // 更新余数
}
while(lc > 1 && c[lc - 1] == 0) lc--;
}
int main(){
string x, y;
cin >> x >> b; //y;// 用字符串读入超大数字(避免整型溢出)
// //减法时比大小
// if(cmp(x, y)){
// swap(x, y);
// cout << '-';
// }
la = x.size();
//lb = y.size();
//lc = max(la, lb); 加减
//lc = la + lb; 乘
lc = la;//除
// 把字符串逆序存入数组,字符转数字
for(int i = 0; i < la; i++) a[i] = x[la - 1 - i] - '0';
//for(int i = 0; i < lb; i++) b[i] = y[lb - 1 - i] - '0';
//add(c, a, b); //高精度加法运算
//sub(c, a, b); //高精度减法运算
//mul(c, a, b); //高精度乘法运算
div(c, a, b);
for(int i = lc - 1; i >= 0; i--) cout << c[i];
return 0;
}