高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。--------百度百科
输入时用字符串存储,转化为int类型数组,一个元素对应一位,也可以几位。本次测试均为一位。存储时按照高位对应下标小的位置,用下标为0的元素存储此数的位数。如6789存到int数组为a[0]=4(总共有4位),a[1]=6,a[2]=7,a[3]=8,a[4]=9;运算时先从1到(a[0]+1)/2元素对换即可。
为了减法运算添加比较函数Compare(),并且将返回值设置为int类型,具体见代码
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int N=200; 6 char s[N]; 7 void input(int a[]) { //输入函数 8 gets(s); 9 a[0]=strlen(s); 10 for(int i=1; i<=a[0]; i++) { 11 a[i]=s[i-1]-'0'; 12 } 13 } 14 15 void output(int a[]) { //输出函数 16 for(int i=1; i<=a[0]; i++) { 17 printf("%d",a[i]); 18 } 19 putchar(' '); 20 } 21 22 int Compare(int a[],int b[]) { //比较函数 返回值定为int类型可以用在Dec函数中 23 if(a[0]>b[0]) 24 return 1; 25 else if(a[0]<b[0]) 26 return -1; 27 else { 28 for(int i=1; i<=a[0]; i++) { 29 if(a[i]>b[i]) { 30 return 1; 31 } else if(a[i]<b[i]) { 32 return -1; 33 } 34 } 35 return 0; 36 } 37 38 } 39 40 void Plus(int a[],int b[]) { //加法函数 a=a+b 41 for(int i=1; i<=(a[0]+1)/2; i++) { 42 int tmp=a[a[0]-i+1]; 43 a[a[0]-i+1]=a[i]; 44 a[i]=tmp; 45 } 46 for(int i=1; i<=(b[0]+1)/2; i++) { 47 int tmp=b[b[0]-i+1]; 48 b[b[0]-i+1]=b[i]; 49 b[i]=tmp; 50 } 51 int l=(a[0]>b[0]?a[0]:b[0]); 52 for(int i=1; i<=l; i++) { 53 a[i+1]+=(a[i]+b[i])/10; 54 a[i]=(a[i]+b[i])%10; 55 } 56 if(a[l+1]) 57 a[0]=l+1; 58 else 59 a[0]=l; 60 for(int i=1; i<=(a[0]+1)/2; i++) { 61 int tmp=a[a[0]-i+1]; 62 a[a[0]-i+1]=a[i]; 63 a[i]=tmp; 64 } 65 for(int i=1; i<=(b[0]+1)/2; i++) { 66 int tmp=b[b[0]-i+1]; 67 b[b[0]-i+1]=b[i]; 68 b[i]=tmp; 69 } 70 } 71 72 void Dec(int a[],int b[]) { //减法函数 a=a-b 73 74 int flg=Compare(a,b); 75 for(int i=1; i<=(a[0]+1)/2; i++) { 76 int tmp=a[a[0]-i+1]; 77 a[a[0]-i+1]=a[i]; 78 a[i]=tmp; 79 } 80 for(int i=1; i<=(b[0]+1)/2; i++) { 81 int tmp=b[b[0]-i+1]; 82 b[b[0]-i+1]=b[i]; 83 b[i]=tmp; 84 } 85 if(flg==1) { 86 for(int i=1; i<=a[0]; i++) { 87 if(a[i]<b[i]) { 88 a[i+1]--; 89 a[i]+=10; 90 } 91 a[i]=a[i]-b[i]; 92 } 93 while(a[a[0]]==0) 94 a[0]--; 95 } 96 if(flg==0) { 97 a[0]=1; 98 a[1]=0; 99 return; 100 } 101 if(flg==-1) { 102 for(int i=1; i<=b[0]; i++) { 103 if(a[i]>b[i]) { 104 b[i+1]--; 105 b[i]+=10; 106 } 107 a[i]=b[i]-a[i]; 108 } 109 a[0]=b[0]; 110 while(a[a[0]]==0) 111 a[0]--; 112 } 113 114 for(int i=1; i<=(a[0]+1)/2; i++) { 115 int tmp=a[a[0]-i+1]; 116 a[a[0]-i+1]=a[i]; 117 a[i]=tmp; 118 } 119 for(int i=1; i<=(b[0]+1)/2; i++) { 120 int tmp=b[b[0]-i+1]; 121 b[b[0]-i+1]=b[i]; 122 b[i]=tmp; 123 } 124 } 125 126 void Mul(int a[],int b[],int c[]){ //乘法函数 a=a*b 127 for(int i=1; i<=(a[0]+1)/2; i++) { 128 int tmp=a[a[0]-i+1]; 129 a[a[0]-i+1]=a[i]; 130 a[i]=tmp; 131 } 132 for(int i=1; i<=(b[0]+1)/2; i++) { 133 int tmp=b[b[0]-i+1]; 134 b[b[0]-i+1]=b[i]; 135 b[i]=tmp; 136 } 137 int l; 138 for(int i=1; i<=a[0]; i++) { 139 for(int j=1,l=i-1;j<=b[0];j++){ 140 c[++l]+=(a[i]*b[j]); 141 } 142 } 143 for(int i=1;i<=l;i++){ 144 if(c[i]>9){ 145 l++; 146 c[i+1]+=c[i]/10; 147 c[i]=c[i]%10; 148 } 149 a[i]=c[i]; 150 } 151 while(a[l]==0) l--; 152 a[0]=l; 153 154 155 156 for(int i=1; i<=(a[0]+1)/2; i++) { 157 int tmp=a[a[0]-i+1]; 158 a[a[0]-i+1]=a[i]; 159 a[i]=tmp; 160 } 161 for(int i=1; i<=(b[0]+1)/2; i++) { 162 int tmp=b[b[0]-i+1]; 163 b[b[0]-i+1]=b[i]; 164 b[i]=tmp; 165 } 166 } 167 168 int main() { 169 170 int a[N]= {0},b[N]= {0},c[N]={0}; 171 freopen("C:\CODE\in.txt", "r", stdin); 172 // freopen("C:\CODE\out.txt","w",stdout); 173 //测试compare函数 174 for(int i=0; i<3; i++) { 175 input(a); 176 input(b); 177 // printf("a = "); 178 // output(a); 179 // printf("b = "); 180 // output(b); 181 if(Compare(a,b)==1) 182 printf("a>b "); 183 else if(Compare(a,b)==-1) 184 printf("a<b "); 185 else 186 printf("a=b "); 187 } 188 189 //测试Plus函数 190 input(a); 191 input(b); 192 Plus(a,b);//a=a+b; 193 printf("a = "); 194 output(a); 195 196 //测试Dec函数 197 for(int i=0; i<3; i++) { 198 input(a); 199 input(b); 200 Dec(a,b);//a=a-b; 201 printf("a = "); 202 output(a); 203 204 } 205 206 //测试Mul函数 207 input(a); 208 input(b); 209 Mul(a,b,c);//a=a*b; 210 printf("a = "); 211 output(a); 212 213 214 215 return 0; 216 }
附上自己的测试数据
1244 12345 12345 1234 0 0 123456789 123456789 223456789987654321 9987654321 123456789 123456789 223456789987654321 2223456789987654321 999 100