C++少儿编程(16)高精度算法(加减法)

一高精度计算概述Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
1、什么是高精度计算:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
C++中,int类型的有效范围:-2^31 ~ 2^31-1(约±21亿),最多10位;long long类型的有效范围:-2^63 ~ 2^63-1(约±922亿亿),最多19位。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
处理超出基本数据类型范围的大整数的运算,称作“高精度计算”。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
高精度计算常见于处理几十位甚至几百位数字的场景。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
2、高精度计算的实现方式:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
使用数组或字符串存储大整数,模拟手工竖式计算过程,按位进行计算并处理进位。

高精度加法计算Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

 

【描述】输入两个数位不超过100的正整数a、b,计算并输出它俩的和。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【输入】输入两行,第一行输入a,第二行输入b。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【输出】输出一行,a+b的和。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

(在计算高精度加法之前,先回忆一下竖式加法的计算过程,此处略过)Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【高精度加法 - 计算过程】Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

1、准备工作:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

使用字符串类型变量存储a、b两个加数,使用整型数组A、B、C,分别存储加数a、加数b与a+b之和的数位。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

2、预处理:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

将a、b的字符串长度分别存入数组A、B的0号元素里,然后分离出字符串中的每个数字,并分别倒序存入A、B数组中。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

3、模拟竖式计算:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

依次取出A、B的相同数位进行加法计算,还要加上前一位的进位数,将三数之和的个位数字存入数组C的相应数位中,十位数字作为下一位计算的进位数。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

4、输出结果:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

倒序输出数组C的每个数位。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

以上就是高精度加法的具体计算步骤。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【高精度加法 - 示例程序】Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

  1. # include <bits/stdc++.h> 
  2. using namespace std; 
  3. // 使用字符串存储大整数a、b 
  4. string a, b; 
  5. // 使用一维数组模拟竖式计算,注意数组长度要+2(可能有进位) 
  6. int A[102], B[102], C[102]; 
  7. // 预处理:记录数位、分离数字、倒序存储 
  8. void fen_li(string s, int a[]) { 
  9.     // 将字符串长度存入数组的0号元素里 
  10.     a[0] = s.size(); 
  11.     // 倒序遍历字符串,分离出数字,正序存入数组中 
  12.     for (int i = 1; i <= a[0]; i++) a[i] = s[a[0]-i] - '0'
  13.     return
  14. //声明加法运算函数(执行具体的竖式运算) 
  15. void big_plus() { 
  16.     // C[0]存储加数的最高数位 
  17.     C[0] = max(A[0], B[0]); 
  18.     // 声明变量j存储进位数字,默认为0 
  19.     int j = 0; 
  20.     // 遍历加数的每个数位,逐位相加 
  21.     for (int i = 1; i <= C[0]; i++) { 
  22.         // 计算当前数位两个加数与进位之和 
  23.         C[i] = A[i] + B[i] + j; 
  24.         // 先计算新的进位 
  25.         j = C[i] / 10; 
  26.         // 再处理结果(和)的当前数位 
  27.         C[i] %= 10; 
  28.     } 
  29.     // 如果最后的进位数字大于0 
  30.     if (j > 0) { 
  31.         // 结果的数位加1 
  32.         C[0]++; 
  33.         // 结果的最高数位设为进位数字 
  34.         C[C[0]] = j; 
  35.     } 
  36.     return
  37. int main() { 
  38.     cin >> a >> b; 
  39.     // 预处理:记录数位、分离数字、倒序存储 
  40.     fen_li(a, A); 
  41.     fen_li(b, B); 
  42.     // 模拟竖式计算 
  43.     big_plus(); 
  44.     // 输出结果:倒序输出数组C中的元素 
  45.     for (int i = C[0]; i > 0; i--) cout << C[i]; 
  46.     cout << endl; 
  47.     return 0; 

Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

高精度加法计算Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

 

 Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【描述】输入两个数位不超过100的正整数a、b,计算并输出它俩的和。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【输入】输入两行,第一行输入a,第二行输入b。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【输出】输出一行,a+b的和。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

(在计算高精度加法之前,先回忆一下竖式加法的计算过程,此处略过)Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【高精度加法 - 计算过程】Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

1、准备工作:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

使用字符串类型变量存储a、b两个加数,使用整型数组A、B、C,分别存储加数a、加数b与a+b之和的数位。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

2、预处理:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

将a、b的字符串长度分别存入数组A、B的0号元素里,然后分离出字符串中的每个数字,并分别倒序存入A、B数组中。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

3、模拟竖式计算:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

依次取出A、B的相同数位进行加法计算,还要加上前一位的进位数,将三数之和的个位数字存入数组C的相应数位中,十位数字作为下一位计算的进位数。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

4、输出结果:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

倒序输出数组C的每个数位。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

以上就是高精度加法的具体计算步骤。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【高精度加法 - 示例程序】Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

  1. # include <bits/stdc++.h> 
  2. using namespace std; 
  3. // 使用字符串存储大整数a、b 
  4. string a, b; 
  5. // 使用一维数组模拟竖式计算,注意数组长度要+2(可能有进位) 
  6. int A[102], B[102], C[102]; 
  7. // 预处理:记录数位、分离数字、倒序存储 
  8. void fen_li(string s, int a[]) { 
  9.     // 将字符串长度存入数组的0号元素里 
  10.     a[0] = s.size(); 
  11.     // 倒序遍历字符串,分离出数字,正序存入数组中 
  12.     for (int i = 1; i <= a[0]; i++) a[i] = s[a[0]-i] - '0'
  13.     return
  14. //声明加法运算函数(执行具体的竖式运算) 
  15. void big_plus() { 
  16.     // C[0]存储加数的最高数位 
  17.     C[0] = max(A[0], B[0]); 
  18.     // 声明变量j存储进位数字,默认为0 
  19.     int j = 0; 
  20.     // 遍历加数的每个数位,逐位相加 
  21.     for (int i = 1; i <= C[0]; i++) { 
  22.         // 计算当前数位两个加数与进位之和 
  23.         C[i] = A[i] + B[i] + j; 
  24.         // 先计算新的进位 
  25.         j = C[i] / 10; 
  26.         // 再处理结果(和)的当前数位 
  27.         C[i] %= 10; 
  28.     } 
  29.     // 如果最后的进位数字大于0 
  30.     if (j > 0) { 
  31.         // 结果的数位加1 
  32.         C[0]++; 
  33.         // 结果的最高数位设为进位数字 
  34.         C[C[0]] = j; 
  35.     } 
  36.     return
  37. int main() { 
  38.     cin >> a >> b; 
  39.     // 预处理:记录数位、分离数字、倒序存储 
  40.     fen_li(a, A); 
  41.     fen_li(b, B); 
  42.     // 模拟竖式计算 
  43.     big_plus(); 
  44.     // 输出结果:倒序输出数组C中的元素 
  45.     for (int i = C[0]; i > 0; i--) cout << C[i]; 
  46.     cout << endl; 
  47.     return 0; 

Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

高精度减法计算Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

 

 Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【描述】输入两个数位不超过100的正整数a、b,计算并输出它俩的差。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【输入】输入两行,第一行输入a,第二行输入b。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【输出】输出一行,a-b的查。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

(在计算高精度减法之前,先回忆一下竖式减法的计算过程,此处略过)Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【高精度减法- 计算过程】Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

1、准备工作:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

使用字符串类型变量存储a、b两个加数,使用整型数组A、B、C,分别存储被减数a、减数b与a-b之差的数位。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

2、判断大小:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

在计算之前,先判断一下a、b的大小,如果a<b,计算结果为负数,将a、b两数交换,确保被减数不小于减数。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

3、预处理:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

将a、b的字符串长度分别存入数组A、B的0号元素里,然后分离出字符串中的每个数字,并分别倒序存入A、B数组中。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

4、模拟竖式计算:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

依次取出A、B的相同数位进行减法计算,如果不够减,向高位借1;注意,计算结果有可能为0,所以计算完毕之后,要去掉开头的0。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

5、输出结果:Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

(1)如果结果为负数,先输出一个负号;Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

(2)再倒序输出数组C中的数位。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

以上就是高精度减法的具体计算步骤。Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【高精度减法 - 示例程序】Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

  1. # include <bits/stdc++.h> 
  2. using namespace std; 
  3. // 使用字符串存储大整数a、b 
  4. string a, b; 
  5. // 使用一维数组模拟竖式计算,注意数组长度要+1 
  6. int A[101], B[101], C[101]; 
  7. // 比较a、b的大小,确定结果的符号 
  8. bool a_dayu_b(string a, string b) { 
  9.     // 如果a的长度小于b的长度,说明a<b 
  10.     if (a.size() < b.size()) return false
  11.     else if (a.size() == b.size()) { 
  12.         // 当a、b的长度相等时,再比较a、b字符串的大小 
  13.         if (a < b) return false
  14.     } 
  15.     // 只要不返回false,就返回true 
  16.     return true
  17. // 预处理:记录数位、分离数字、倒序存储 
  18. void fen_li(string s, int a[]) { 
  19.     // 将字符串长度存入数组的0号元素里 
  20.     a[0] = s.size(); 
  21.     // 倒序遍历字符串,分离出数字,正序存入数组中 
  22.     for (int i = 1; i <= a[0]; i++) a[i] = s[a[0]-i] - '0'
  23.     return
  24. // 声明减法运算函数(执行具体的竖式运算) 
  25. void big_minus() { 
  26.     // C[0]默认为被减数A的数位 
  27.     C[0] = A[0]; 
  28.     // 遍历被减数的每个数位,逐位相减 
  29.     for (int i = 1; i <= C[0]; i++) { 
  30.         // 如果不够减,向高位借1,当前数位加10 
  31.         if (A[i] < B[i]) { 
  32.             A[i+1]--; 
  33.             A[i] += 10; 
  34.         } 
  35.         // 当前数位相减 
  36.         C[i] = A[i] - B[i]; 
  37.     } 
  38.     // 去除开头的0 
  39.     while (C[C[0]] == 0 && C[0] > 1) C[0]--; 
  40.     return
  41. int main() { 
  42.     cin >> a >> b; 
  43.     // 比较大小:确定结果符号 
  44.     bool flag = a_dayu_b(a, b); 
  45.     if (!flag) swap(a, b); 
  46.     // 预处理:记录数位、分离数字、倒序存储 
  47.     fen_li(a, A);  
  48.     fen_li(b, B); 
  49.     // 模拟竖式计算 
  50.     big_minus(); 
  51.     // 输出结果:先根据情况输出负号,再倒序输出C中的数位 
  52.     if (!flag) cout << "-"
  53.     for (int i = C[0]; i > 0; i--) cout << C[i]; 
  54.     cout << endl; 
  55.     return 0; 

课后习题Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

 

输出斐波那契数列的第n项。(n<1000)Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【参考代码】斐波那契数列(高精度加法)Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

【方法一】使用字符串型一维数组存储每一项Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库

  1. # include <bits/stdc++.h> 
  2. using namespace std; 
  3. // 使用字符串型一维数组存储斐波那契数列每一项 
  4. string s[1000] = {"0""1"}; 
  5. // 使用一维数组模拟竖式计算,注意数组长度要+2(可能有进位) 
  6. int A[1002], B[1002], C[1002]; 
  7. // 预处理:记录数位、分离数字、倒序存储 
  8. void fen_li(string s, int a[]) { 
  9.     // 将字符串长度存入数组的0号元素里 
  10.     a[0] = s.size(); 
  11.     // 倒序遍历字符串,分离出数字,正序存入数组中 
  12.     for (int i = 1; i <= a[0]; i++) a[i] = s[a[0]-i] - '0'
  13.     return
  14. //声明加法运算函数(执行具体的竖式运算) 
  15. void big_plus() { 
  16.     // C[0]存储加数的最高数位 
  17.     C[0] = max(A[0], B[0]); 
  18.     // 声明变量j存储进位数字,默认为0 
  19.     int j = 0; 
  20.     for (int i = 1; i <= C[0]; i++) { 
  21.         // 计算当前数位两个加数与进位之和 
  22.         C[i] = A[i] + B[i] + j; 
  23.         // 先计算新的进位 
  24.         j = C[i] / 10; 
  25.         // 再处理结果(和)的当前数位 
  26.         C[i] %= 10; 
  27.     } 
  28.     // 如果最后的进位数字大于0 
  29.     if (j > 0) { 
  30.         // 结果的数位加1 
  31.         C[0]++; 
  32.         // 结果的最高数位设为进位数字 
  33.         C[C[0]] = j; 
  34.     } 
  35.     return
  36. int main() { 
  37.     int n; 
  38.     cin >> n; 
  39.     // 如果n小于2,直接输出 
  40.     if (n < 2) cout << n << endl; 
  41.     else { 
  42.         // 否则,循环计算每一项,并将结果存入数组中 
  43.         for (int i = 2; i <= n; i++) { 
  44.             // 预处理:记录数位、分离数字、倒序存储 
  45.             fen_li(s[i-2], A); 
  46.             fen_li(s[i-1], B); 
  47.             // 模拟竖式计算 
  48.             big_plus(); 
  49.             // 将数组C中的元素倒序转成字符串存入s中 
  50.             string ss = ""
  51.             for (int j = C[0]; j > 0; j--) {    // 倒序遍历 
  52.                 char ch = C[j] + '0';   // 将数字转成字符 
  53.                 ss += ch;       // 将字符合并到字符串中 
  54.             } 
  55.             s[i] = ss;  // 将合并好的字符串存入字符串数组中 
  56.         } 
  57.         // 输出结果:直接输出s数组中的最后一个元素即可 
  58.         cout << s[n] << endl; 
  59.     }  
  60.     return 0; 
【方法二】使用二维整型数组存储每一项
  1. # include <bits/stdc++.h> 
  2. using namespace std; 
  3. // 使用二维整型数组存储斐波那契数列每一项 
  4. // 每一行表示一项斐波那契数(倒序存储的数位) 
  5. int a2[1000][1000] = { 
  6.     {1, 0},     // 第0号元素 
  7.     {1, 1}      // 第1号元素 
  8. }; 
  9. // 只需声明一个一维整型数组C用来存储和 
  10. int C[1002]; 
  11. // A、B两个数组作为参数传入运算函数 
  12. void big_plus(int A[], int B[]) { 
  13.     // C[0]存储加数的最高数位 
  14.     C[0] = max(A[0], B[0]); 
  15.     // 声明变量j存储进位数字,默认为0 
  16.     int j = 0; 
  17.     for (int i = 1; i <= C[0]; i++) { 
  18.         // 计算当前数位两个加数与进位之和 
  19.         C[i] = A[i] + B[i] + j; 
  20.         // 先计算新的进位 
  21.         j = C[i] / 10; 
  22.         // 再处理结果(和)的当前数位 
  23.         C[i] %= 10; 
  24.     } 
  25.     // 如果最后的进位数字大于0 
  26.     if (j > 0) { 
  27.         // 结果的数位加1 
  28.         C[0]++; 
  29.         // 结果的最高数位设为进位数字 
  30.         C[C[0]] = j; 
  31.     } 
  32.     return
  33. int main() { 
  34.     int n; 
  35.     cin >> n; 
  36.     // 如果n大于1 
  37.     if (n > 1) { 
  38.         // 循环计算(更新)每一项 
  39.         for (int i = 2; i <= n; i++) { 
  40.             // 模拟竖式计算:将前两项传入计算函数 
  41.             big_plus(a2[i-2], a2[i-1]); 
  42.             // 更新a2的第i项:将数组C的元素正序存入a2[i]中 
  43.             for (int j = 0; j <= C[0]; j++) a2[i][j] = C[j]; 
  44.         } 
  45.     } 
  46.     // 输出结果:倒序输出a2[n]的所有数位 
  47.     for (int i = a2[n][0]; i > 0; i--) cout << a2[n][i]; 
  48.     cout << endl; 
  49.     return 0; 
Kl0100150满分答卷(100150.com)-青少年编程等级考试及竞赛题库
 

关 键 词

高精度算法

相关教程

提示声明

  • 免责声明:本站资源均来自网络或者用户投稿,仅供用于学习和交流:如有侵权联系删除!

猜你喜欢