对接CSP-J/S认证C++算法蓝桥等考导学/二级:高精度运算/之一(8)高精度运算(一)


一、观看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;}