文档介绍:高精度算法#include <> #include <> #include <> #include <> int an,bn,fa=1,fb=1; /*把 an,bn, k设为全局变量,an纪录第一个高精度数组的位数,bn 纪录第二个高精度数组的位数,k纪录输出结果的位数*/ char b1[250], b2[250]; /*纪录需要计算的两个高精度数据*/ void input(int a1[],int a2[]) /*函数 inpu t为输入函数,用来纪录两个待计算的高精度数据,*/ { int i,ai=1,bi=1; scanf ( "%s%s", b1, b2 ); /*输入两个高精度数据*/ an = strlen( b1 ); /*an 纪录 b1 的位数*/ bn = strlen( b2 ); /*bn 纪录 b2 的位数*/ if(b1[0]==45) { an--; fa=-1;ai=0;} /*判断数组的符号*/ if(b2[0]==45) { bn--; fb=-1;bi=0;} for (i=0; i<an; i++,ai++) {a1[i]=b1[an-ai]-'0'; printf("%d",a1[i]);} /*把字符形数据 b1 转为整数形数据,同样用数组纪录*/ for (i=0; i<bn; i++,bi++) a2[i]=b2[bn-bi]-'0'; /*同上*/ return; } void addition(int a[],int b[],int q) /*高精度加法运算*/ { int i,c[251]={0},k; if(fa*fb>0||q) { if(an>bn) k=an; else k=bn; /*用k纪录结果的最小位数*/ for(i=0;i<k;i++) { c[i]=a[i]+b[i]+c[i]; c[i+1]=(int)c[i]/10; c[i]=(int)c[i]%10; } /*高精度加法运算过程*/ if(c[k]) k++; /*判断最后结果的位数*/ if(fa<0&&q||fa<0) printf("-"); for(i=k-1;i>=0;i--) printf("%d",c[i]); /*输出结果*/ return; } else subtraction(a,b,1); return; } subtraction(int a[],int b[],int q) /*高精度减法运算*/ { int i,f=0,c[251]={0},k; if(fa*fb>0||q) { if(an>bn) k=an; else /*用 k纪录结果的最大位数*/{ k=bn; for(i=k;a[i]<=b[i]&&i>=0;i--) if(a[i]<b[i]) f=1; /*f纪录结果符号*/ } if(!f) /*高精度减法运算过程*/ for(i=0;i<k;i++) { if(a[i]<b[i]) { a[i+1]--; a[i]+=10; } c[i]=a[i]-b[i]; } else /*当 a<b 时的处理*/ for(i=0;i<k;i++) { if(b[i]<a[i]) { b[i+1]--; b[i]+=10; } c[i]=b[i]-a[i]; } while(!c[k-1]&&k>1) k--; /*判断最后结果的位数*/ if(q&&(fa>0&&f||fa<0&&!f)||fa>0&&(fb>0&&!f||f&&!q)) printf("-"); /*如果 f为真是输出负号*/ for(i=k-1;i>=0;i--) printf("%d",c[i]); return; } else addition(a,b,1); } void multiplication( int a[], int b[]) /*高精度乘法运算*/ { int i, j, c[501] = {0},k; k= an + bn - 1; /*用 k纪录结果的最大位数*/ for(i = 0;i< an; i++) /*高精度乘法运算过程*/ for(j = 0;j< bn; j++) { c[i+j] = a[i] * b[j] + c[i+j]; c[i+j+1] = c[i+j] / 10 + c[i+j+1]; c[i+j] = c[i+j] % 10; } while(!c[k]) k--; /*判断最后结果的位数*/ if(fa*fb<0) printf("-"); for(i =k;i >= 0; i--) printf("%d",c[i]); /*输出结