不用高级工具,用最基本的数组学会高精度四则运算!适合少儿编程入门-野牛程序员教少儿编程
作者:野牛程序员:2025-05-09 08:53:55算法阅读 2364
不用高级工具,用最基本的数组学会高精度四则运算!适合少儿编程入门-野牛程序员教少儿编程
? 不用高级工具,小朋友也能搞懂!
—— 高精度加减乘除完全手册(数组模拟法)
?适合信息学奥赛入门 / 少儿编程兴趣班 / 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

