不用高级工具,用最基本的数组学会高精度四则运算!适合少儿编程入门-野牛程序员教少儿编程
作者:野牛程序员: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
