AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

《高精度--加减乘除》求赞!!!

作者: 作者的头像   芊芊晚 ,  2025-01-10 19:11:08 ,  所有人可见 ,  阅读 39


3


B站已出同步讲解,欢迎观看。
希望对你学习高精度有用。

高精度加法

讲解视频

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;
string a, b; // 将输入视为一个字符串
int A[N], B[N], ans[N]; // 分别存储两个加数,以及和
int l1, l2; // 表示A,B数组分别存储到哪一位了

int main() {
    cin >> a >> b;
    int n = a.size(), m = b.size();
    // 1.倒序存储
    for (int i = n - 1; i >= 0; i --) A[l1 ++] = a[i] - '0';
    for (int i = m - 1; i >= 0; i --) B[l2 ++] = b[i] - '0';
    // 2.计算结果的最大长度
    int l = max(l1, l2);
    // 3.先计算加法
    for (int i = 0; i < l; i ++)
        ans[i] = A[i] + B[i];
    // 4.考虑进位 与 保留位
    for (int i = 0; i < l; i ++) {
        // 一定要先进位再处理保留位
        // 进位
        ans[i + 1] += ans[i] / 10;
        // 保留位
        ans[i] %= 10;
    }   
    // 5.最高位是否有进位
    if(ans[l]) l ++;
    // 6.处理前导零
    // 特殊数据 : 1. 0012 + 02 = 14  2. 000 + 0 = 0
    while(ans[l - 1] == 0 && l > 1) l --;
    // 7.倒序输出答案
    for (int i = l - 1; i >= 0; i --) cout << ans[i];
    return 0;
}

高精度减法

讲解视频

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

string a, b;
int A[N], B[N], C[N], l1, l2;
bool neg;

int main() {
    cin >> a >> b;
    // 确保 大数字 - 小数字
    if(a.size() < b.size() || a.size() == b.size() && a < b) {
        neg = 1;
        swap(a, b);
    }
    int n = a.size(), m = b.size();
    // 倒序存储
    for (int i = n - 1; i >= 0; i --) A[l1 ++] = a[i] - '0';
    for (int i = m - 1; i >= 0; i --) B[l2 ++] = b[i] - '0';

    // 最大计算多少次
    int l = n;
    int t = 0;
    for (int i = 0; i < l; i ++) {
        int diff = A[i] - B[i] - t; // 表示本位差值
        if(diff < 0) {
            diff += 10;
            t = 1;
        } else {
            t = 0;
        }
        C[i] = diff;
    }

    // 删除前导零
    while(l > 0 && C[l] == 0) l --;
    if(neg) cout << "-";
    for (int i = l; i >= 0; i --) cout << C[i];
    return 0;
}

高精度*低精度

讲解视频

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;
const int N = 1e5 + 10;
int A[N], l;

int main() {
    string a; cin >> a;
    // 将字符串转化为数字存储在数组中
    for (int i = a.size() - 1; ~i; i --) A[l ++] = a[i] - '0';
    int b; cin >> b;
    if(b) l += log10(b);
    // 先进行乘法
    for (int i = 0; i < l; i ++)
        A[i] *= b;

    // 在考虑进位
    for (int i = 0; i < l; i ++) {
        // 先进位后存储,不然BBQ
        A[i + 1] += A[i] / 10;
        A[i] %= 10;
    }
    // 判断是否存在前导零
    while(l > 0 && A[l] == 0) l --;
    for (int i = l; ~i; i --) cout << A[i];

    return 0;
}

高精度 * 高精度

讲解视频

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1e5 + 10;

int A[N], B[N], C[N], l1, l2;

int main() {
    string a, b; cin >> a >> b;
    int n = a.size(), m = b.size();
    for (int i = n - 1; ~i; i --) A[l1 ++] = a[i] - '0';
    for (int i = m - 1; ~i; i --) B[l2 ++] = b[i] - '0';

    // 进行模拟乘法
    for (int i = 0; i < n; i ++)
        for (int j = 0; j < m; j ++) {
            int dis = i + j;
            C[dis] += A[i] * B[j];
        }


    // 最大的可能位数为 n + m
    int l = n + m;
    for (int i = 0; i < l; i ++) {
        C[i + 1] += C[i] / 10;
        C[i] %= 10;
    }

    // 寻找第一个非零元素    
    while(l > 1 && C[l - 1] == 0) l --;

    for (int i = l - 1; ~i; i --) cout << C[i];
    return 0;
}

高精度除法 - 输出商和余数

视频讲解

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1e5 + 10;

string a;
int A[N], C[N];
int b;

int main() {
    cin >> a >> b;
    int n = a.size();
    for (int i = 0; i < n; i ++) A[i] = a[i] - '0';

    int t = 0;
    for (int i = 0; i < n; i ++) {
        C[i] = (t * 10 + A[i]) / b;
        t = (t * 10 + A[i]) % b;
    }   

    int p = 0;
    while(C[p] == 0 && p < n - 1) p ++;
    for (int i = p; i < n; i ++) cout << C[i];
    cout << endl;
    cout << t;
    return 0;
}

高精度除法 - 保留小数点后几位小数

#include <iostream>
#include <cstring>
#include <algorithm>


using namespace std;

int main() {
    int a, b, n; cin >> a >> b >> n;
    cout << a / b << ".";
    int t = a % b;
    for (int i = 1; i <= n; i ++) {
        t *= 10;
        cout << t / b;
        t %= b;
    }
    return 0;
}

2 评论


用户头像
Oscar2015   2025-01-16 08:34         踩      回复

为什么没有高精度/高精度

用户头像
芊芊晚   2025-01-16 11:04         踩      回复

之后更,有点长


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息