一、观看PPT教程
【01】高精度运算(一)
二、练习题(不清楚回头查看有关PPT)
【01】高精度运算的描述,改正错误的地方:
高精度算法是一种处理大数的计算方法。它可以用于处理大数的加减乘除、比较大小等运算,以及求解大整数的阶乘、幂运算等问题。当参与运算的数据超出C++数据类型的取值范围时,我们就会用到高精度算法。【02】高精度运算的注意事项,改正错误的地方:①数据的接收和存储——当需要处理的数据超过了任何数据类型所能容纳的范围,可以采用字符串形式输入,并将其中每一位字符转化为数字,存入数组中。②代码实现——数字字符串形式输入,将其转化为整型数组,并逆序存储。③逆序存储的原因——1.使两个参与运算的数据的最高位对齐;2.方便处理最高位运算后的进位。④高精度位数的确定——运算规则如同算术运算。由于高精度运算的结果可能使数据长度发生增减,因此不仅需要用整型数组存储数据,还需要记录整型数组的元素个数,也就是数据实际长度。【03】高精度位数可以用变量或数组第一个值(array[0])表示,下面两个初始化代码,分别属于哪一种?
①
·
·
·
·
·
·
·
·
·
·
·
int init(int a[]){ string s; cin >> s; int len = s.length(); for(int i=0; i<len; i++) { a[i]=s[len-i-1] - '0'; } return len;}
②
·
·
·
·
·
·
·
·
·
·
·
int init(int a[]){ string s; cin >> s; a[0] = s.length(); for(int i=0; i<len; i++) { a[i+1]=s[len-i-1] - '0'; } return len;}
【04】对于有符号高精度数据的运算,除了记录数据本身以外,还需要记录数据的正负号,可以使用结构体存储数据。从下面的结构体代码中选出用变量保存位数的:
①
·
·
·
·
·
struct Data{ int flag; int a[N];}
②
·
·
·
·
·
·
struct Data{ int flag; int len; int a[N];}
【05】下面是无符号整数的加法运算代码,请补全漏写的一行:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
#include<iostream>#include<string>using namespace std;int A[201],B[201],C[202];string s1,s2;int init(int a[], string &s){ cin >> s; int len = s.length(); for(int i=0; i<len; i++) { a[i]=s[len-i-1] - '0'; } return len; }int main(){ int lena = init(A, s1); int lenb = init(B, s2); int lenc = max(lena, lenb); int x = 0; for(int i = 0; i < lenc; i++) { C[i] = A[i] + B[i] + x; x = C[i] / 10; C[i] %= 10; } while(C[lenc] == 0 && lenc >0) lenc--; for(int i = lenc; i >= 0; i--) cout << C[i]; cout << endl; return 0;}
【06】下面是无符号整数的减法运算代码,请补全漏写的一行:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
#include<iostream>#include<string>using namespace std;int A[201],B[201],C[202];string s1,s2;int lena, lenb, lenc;int init(int a[], string &s){ cin >> s; int len = s.length(); for(int i=0; i<len; i++) { a[i]=s[len-i-1] - '0'; } return len; }void sub(){ for(int i = 0; i < lenc; i++) { C[i] = A[i] - B[i]; if(C[i] < 0) { C[i + 1]--; C[i] += 10; } } }int main(){ lena = init(A, s1); lenb = init(B, s2); lenc = max(lena, lenb); if(lena < lenb || ( lena == lenb && s1 < s2)){ swap(A, B); } sub(); while(C[lenc] == 0 && lenc >0) lenc--; for(int i = lenc; i >= 0; i--) cout << C[i]; cout << endl; return 0;}