当前位置:首页算法 > 正文

不用高级工具,用最基本的数组学会高精度四则运算!适合少儿编程入门-野牛程序员教少儿编程

作者:野牛程序员:2025-05-09 08:53:55算法阅读 1988
不用高级工具,用最基本的数组学会高精度四则运算!适合少儿编程入门-野牛程序员教少儿编程

🧮 不用高级工具,小朋友也能搞懂!

—— 高精度加减乘除完全手册(数组模拟法)

🌟适合信息学奥赛入门 / 少儿编程兴趣班 / CSP-J初赛备考


📚 为什么要学“高精度运算”?

在小学数学中,2位数、3位数加减乘除就足够了;
但到了编程世界,有时候数值大得惊人,像这样:

987654321987654321 × 123456789123456789

普通计算机变量装不下这么大的数怎么办?
这时就要用——高精度计算


🧠 小朋友能理解的关键概念:

  • 💡 高精度运算就是把大数变成一位一位地存在数组中,然后手动实现加减乘除。

  • 🧱 每一位像是积木一样拼起来,个位在数组前面(低位在前,高位在后)。

  • 🧠 操作和小学竖式算法几乎一模一样,适合启发编程思维。


🚀 第一步:把数字变成数组

输入一个大整数字符串,比如 "12345"
程序将它存为数组:

arr[0] = 5(个位)  
arr[1] = 4(十位)  
arr[2] = 3(百位)  
...依此类推

这就可以一位一位地操作它啦!


✏️ 一、数组模拟高精度加法

void add() {
    int carry = 0;
    for (int i = 0; i < lenA || i < lenB; ++i) {
        int x = (i < lenA ? A[i] : 0);
        int y = (i < lenB ? B[i] : 0);
        int sum = x + y + carry;
        C[lenC++] = sum % 10;
        carry = sum / 10;
    }
    if (carry) C[lenC++] = carry;
}

🧠 思路讲解:

  • 从个位开始,加起来!

  • 大于10怎么办?就像笔算一样“进位”。

  • 最后记得判断有没有多出的进位。


✏️ 二、高精度减法(A ≥ B)

void sub() {
    int borrow = 0;
    for (int i = 0; i < lenA; ++i) {
        int x = A[i] - borrow;
        int y = (i < lenB ? B[i] : 0);
        if (x < y) {
            C[lenC++] = x + 10 - y;
            borrow = 1;
        } else {
            C[lenC++] = x - y;
            borrow = 0;
        }
    }
    while (lenC > 1 && C[lenC - 1] == 0) lenC--;
}

🎯 关键点:

  • 用“借位”处理不够减的情况;

  • 别忘了去掉高位的 0 哦!


✏️ 三、高精度乘法(大整数 × 普通数)

void mul(int b) {
    int carry = 0;
    for (int i = 0; i < lenA; ++i) {
        int prod = A[i] * b + carry;
        C[lenC++] = prod % 10;
        carry = prod / 10;
    }
    while (carry) {
        C[lenC++] = carry % 10;
        carry /= 10;
    }
}

🧠 像小学竖式乘法一样:

  • 从个位到高位依次乘;

  • 每次乘完记得进位。


✏️ 四、高精度除法(大整数 ÷ 普通数)

void div(int b, int& r) {
    r = 0;
    for (int i = lenA - 1; i >= 0; --i) {
        r = r * 10 + A[i];
        C[lenC++] = r / b;
        r %= b;
    }
    while (lenC > 1 && C[0] == 0) {
        for (int i = 0; i < lenC - 1; ++i)
            C[i] = C[i + 1];
        lenC--;
    }
}

🧠 思维方法:

  • 从高位到低位“模拟竖式除法”

  • 每次除完记得留下余数继续拼下一个数

  • 最后别忘了除完去前导0!


🧑‍🏫 适合布置的趣味练习:

题目内容
加法小游戏输入两个超级大数,输出它们的和
比较大小输入两个大整数,判断哪个大
连乘练习输入一个大整数 A 和一个 int B,输出 A×B
除法模拟大整数 A 除以整数 B,输出商和余数


📌 总结金句:

大数装不下,就一位一位存!
操作像竖式,思路不怕深!

🧮 高精度加法(数组模拟)

#include <iostream>
#include <cstring>
using namespace std;

const int N = 1000;
int A[N], B[N], C[N]; // 存储数字(低位在前)
int lenA, lenB, lenC; // 各数组有效长度

// 将字符串转为倒序数组
void strToNum(char str[], int num[], int &len) {
    len = strlen(str);
    for (int i = 0; i < len; i++)
        num[i] = str[len - i - 1] - '0';
}

// 高精度加法:C = A + B
void add() {
    lenC = 0;
    int carry = 0;
    for (int i = 0; i < lenA || i < lenB; i++) {
        int x = (i < lenA ? A[i] : 0);
        int y = (i < lenB ? B[i] : 0);
        int sum = x + y + carry;
        C[lenC++] = sum % 10;
        carry = sum / 10;
    }
    if (carry) C[lenC++] = carry;
}

// 输出高精度结果
void printNum(int num[], int len) {
    for (int i = len - 1; i >= 0; i--)
        cout << num[i];
    cout << endl;
}

int main() {
    char s1[N], s2[N];
    cout << "请输入两个大整数:" << endl;
    cin >> s1 >> s2;

    strToNum(s1, A, lenA);
    strToNum(s2, B, lenB);

    add();

    cout << "它们的和是:" << endl;
    printNum(C, lenC);
    return 0;
}

➖ 高精度减法(假设 A ≥ B)

#include <iostream>
#include <cstring>
using namespace std;

const int N = 1000;
int A[N], B[N], C[N];
int lenA, lenB, lenC;

void strToNum(char str[], int num[], int &len) {
    len = strlen(str);
    for (int i = 0; i < len; i++)
        num[i] = str[len - i - 1] - '0';
}

// 高精度减法:C = A - B(A ≥ B)
void sub() {
    lenC = 0;
    int borrow = 0;
    for (int i = 0; i < lenA; i++) {
        int x = A[i] - borrow;
        int y = (i < lenB ? B[i] : 0);
        if (x < y) {
            C[lenC++] = x + 10 - y;
            borrow = 1;
        } else {
            C[lenC++] = x - y;
            borrow = 0;
        }
    }
    while (lenC > 1 && C[lenC - 1] == 0) lenC--; // 去除前导 0
}

void printNum(int num[], int len) {
    for (int i = len - 1; i >= 0; i--)
        cout << num[i];
    cout << endl;
}

int main() {
    char s1[N], s2[N];
    cout << "请输入两个大整数(前者不小于后者):" << endl;
    cin >> s1 >> s2;

    strToNum(s1, A, lenA);
    strToNum(s2, B, lenB);

    sub();

    cout << "它们的差是:" << endl;
    printNum(C, lenC);
    return 0;
}

✖️ 高精度乘法(大整数 × 普通数)

#include <iostream>
#include <cstring>
using namespace std;

const int N = 1000;
int A[N], C[N];
int lenA, lenC;

void strToNum(char str[], int num[], int &len) {
    len = strlen(str);
    for (int i = 0; i < len; i++)
        num[i] = str[len - i - 1] - '0';
}

// 高精度乘法:C = A × b
void mul(int b) {
    lenC = 0;
    int carry = 0;
    for (int i = 0; i < lenA; i++) {
        int prod = A[i] * b + carry;
        C[lenC++] = prod % 10;
        carry = prod / 10;
    }
    while (carry) {
        C[lenC++] = carry % 10;
        carry /= 10;
    }
}

void printNum(int num[], int len) {
    for (int i = len - 1; i >= 0; i--)
        cout << num[i];
    cout << endl;
}

int main() {
    char s1[N];
    int b;
    cout << "请输入一个大整数和一个小整数:" << endl;
    cin >> s1 >> b;

    strToNum(s1, A, lenA);
    mul(b);

    cout << "乘积是:" << endl;
    printNum(C, lenC);
    return 0;
}

➗ 高精度除法(大整数 ÷ 普通数)

#include <iostream>
#include <cstring>
using namespace std;

const int N = 1000;
int A[N], C[N];
int lenA, lenC;

void strToNum(char str[], int num[], int &len) {
    len = strlen(str);
    for (int i = 0; i < len; i++)
        num[i] = str[len - i - 1] - '0';
}

// 高精度除法:C = A ÷ b,返回余数 r
void div(int b, int &r) {
    lenC = 0;
    r = 0;
    for (int i = lenA - 1; i >= 0; i--) {
        r = r * 10 + A[i];
        C[lenC++] = r / b;
        r %= b;
    }

    // 去除前导 0(如 000123)
    while (lenC > 1 && C[0] == 0) {
        for (int i = 0; i < lenC - 1; i++)
            C[i] = C[i + 1];
        lenC--;
    }
}

void printNum(int num[], int len) {
    for (int i = 0; i < len; i++)
        cout << num[i];
    cout << endl;
}

int main() {
    char s1[N];
    int b, r;
    cout << "请输入一个大整数和一个除数:" << endl;
    cin >> s1 >> b;

    strToNum(s1, A, lenA);
    div(b, r);

    cout << "商是:" << endl;
    printNum(C, lenC);
    cout << "余数是:" << r << endl;
    return 0;
}


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • 不用高级工具,用最基本的数组学会高精度四则运算!适合少儿编程入门-野牛程序员教少儿编程
  • 相关推荐

    最新推荐

    热门点击