高精度算法(一)

高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。--------百度百科

输入时用字符串存储,转化为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('\n');
 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\n");
183         else if(Compare(a,b)==-1)
184             printf("a<b\n");
185         else
186             printf("a=b\n");
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

 

posted @ 2016-01-26 21:45  闪耀子  阅读(385)  评论(0编辑  收藏  举报