高精度运算的计算思高精度运算计算中需要处理好以下几个问题:
1) 数据的接收方法和存储方法
数据的接收和存储:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算
将每一位数取出,存入数组中。
2)高精度数位数的确定
位数的确定:接收时往往用字符串,所以它的位数就等于字符串的长度
3)进位,错位处理
进位,错位处理
加法运算:
c[i] = a[i] + b[i] if(c[i]>10){ c[i]%10=10; ++c[i+1]; }
减法运算:
if(a[i]<b[i]){ --a[i+1]; a[i]+=10; }
乘法运算:
c[i+j-1]=a[i]*b[i]+x+c[i+j-1]; x = c[i+j-1]/10; c[i+j-1]%=10;
算法实现
# 关于 高精度加法 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; #define MAXLEN 110 // 确保长度 int main(){ char al[MAXLEN],bl[MAXLEN]; // 原始数字字符串 // 两个加数结果 加数和结果的长度 进位 int a[MAXLEN],b[MAXLEN],c[MAXLEN], lena,lenb,lenc,x; // 初始化 memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); //输入加数和被加数 scanf("%s%s",al,bl); // 计算两个字符串的长度 lena = strlen(al); lenb = strlen(bl); //加数放入a数组 for(int i=0;i<=lena-1;i++){ a[lena-i]=al[i]-'0'; } //加数放入b数组 for(int i=0;i<=lenb-1;i++){ b[lenb-i]=bl[i]-'0'; } lenc = 1 ; x = 0 ; while(lenc<=lena || lenc<=lenb){ // 以两者中的最大的那个为 结束标识 c[lenc] = a[lenc] + b[lenc] + x ; // 两数相加 x = (c[lenc]/10) ; // 计算进位 c[lenc] %= 10 ; // 本位保留的数 lenc++ ; } c[lenc] = x ; // 排除非零问题 if(c[lenc]==0){ lenc--; // 处理最高进位 } for(int i=lenc;i>=1;i--){ cout<<c[i] ; // 输出结果 } cout<<endl; return 0 ; }
//高精度减法 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; #define MAXLEN 110 int main(){ int a[MAXLEN],b[MAXLEN],c[MAXLEN],lena,lenb,lenc,i; char n[MAXLEN],n1[MAXLEN],n2[MAXLEN]; // 初始化 memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); //输入减数和被减数 scanf("%s%s",n1,n2); if(strlen(n1)<strlen(n2) || (strlen(n1)==strlen(n2)&&strcmp(n1,n2) < 0 )){ strcpy(n,n1); strcpy(n1,n2); strcpy(n2,n); cout<<"-"; // 交换了减数和被减数,结果为负数 } // 计算两个字符串的长度 lena = strlen(n1); lenb = strlen(n2); //被减数放入a数组 for(int i=0;i<=lena-1;i++){ a[lena-i]=n1[i]-'0'; } //减数放入b数组 for(int i=0;i<=lenb-1;i++){ b[lenb-i]=n2[i]-'0'; } i = 1 ; while(i<=lena || i<=lenb){ // 什么时候结束 if(a[i]<b[i]){ a[i]+=10; // 不够减,那么向高位借1当十 a[i+1]--; } c[i] = a[i]-b[i] ; // 对应位相减 i++; } lenc = i ; while((c[lenc]==0)&&(lenc>1)){ lenc--; //最高位的 0 不输出 } for(i=lenc;i>=1;i--){ cout<<c[i]; } cout<<endl; return 0 ; }