高精度运算 (参考模板...仅供参考)

  比较简短的高精度加法和减法运算模板。大除法的日后更新。

 1 /* 两个非负的大整数相加 */
 2 void big_plus(char a[],char b[],char ans[])
 3 {
 4     int c[N],d[N];
 5     memset(c,0,sizeof(c)); memset(d,0,sizeof(d));//数组初始化
 6     int len_a,len_b,i,j,k;
 7     //
 8     len_a=strlen(a); len_b=strlen(b);
 9     //
10     i=1;
11     for(k=len_a-1;k>=0;k--)
12         c[i++]=a[k]-'0';
13     j=1;
14     for(k=len_b-1;k>=0;k--)
15         d[j++]=b[k]-'0';
16     //
17     k=len_a>len_b?len_a:len_b; //k取数组a、b中较长的长度
18     //
19     //处理进位
20     for(i=1;i<=k;i++)
21     {
22         c[i+1]+=(c[i]+d[i])/10;
23         c[i]=(c[i]+d[i])%10;
24     }
25     //
26     if(c[k+1]) //判断最高位是否有进位
27         ++k;
28     j=0;
29     for(i=k;i>=1;i--)
30         ans[j++]=c[i]+'0';
31 }
 1 int cmp(char a[],char b[])
 2 {
 3     int lena,lenb,i;
 4     lena=strlen(a); lenb=strlen(b);
 5     if(lena<lenb)
 6         return -1;
 7     else if(lena>lenb)
 8         return 1;
 9     else
10     {
11         if(strcmp(a,b)==0)
12             return 0;
13         else
14         {
15             for(i=0;i<lena;i++)
16             {
17                 if(a[i]>b[i])
18                     return 1;
19                 if(b[i]>a[i])
20                     return -1;
21             }
22         }
23     }
24 }
25 /*  只考虑减数和被减数都为正数的情况 这个模板代码不是特别短...暂时没想到更优的... */
26 void big_sub(char a[],char b[],char ans[])
27 {
28     int lena,lenb,i,flag,k; int c[N],d[N],temp[N];
29     memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); memset(temp,0,sizeof(temp));
30     lena=strlen(a); lenb=strlen(b);
31     //
32     if(strcmp(a,b)==0)
33     {
34         strcpy(ans,"0");
35         return;
36     }
37     //如果被减数大于减数
38     if(cmp(a,b)>0)
39     {
40         flag=0;//说明差为正
41         for(i=0;i<lena;i++)
42             c[i]=a[lena-1-i]-'0';
43         for(i=0;i<lenb;i++)
44             d[i]=b[lenb-i-1]-'0';
45     }
46 
47     else //如果减数大于被减数
48     {
49         flag=1;//说明差为负
50         for(i=0;i<lenb;i++)
51             c[i]=b[lenb-i-1]-'0';
52         for(i=0;i<lena;i++)
53             d[i]=a[lena-i-1]-'0';
54     }
55     //
56     k=lena>lenb?lena:lenb;
57     for(i=0;i<k;i++)
58     {
59         if(c[i]<d[i])
60         {
61             c[i+1]--;
62             temp[i]=c[i]+10-d[i];
63         }
64         else
65             temp[i]=c[i]-d[i];
66     }
67     //判断高位是否为0
68     while(!temp[i-1])
69     {
70         --i;
71         --k;
72     }
73     if(flag)
74     {
75         for(i=1;i<=k;i++)
76             ans[i]=temp[k-i]+'0';
77         ans[0]='-';
78     }
79     else
80     {
81         for(i=0;i<k;i++)
82             ans[i]=temp[k-1-i]+'0';
83     }
84     //
85 }
 1 /* 两个非负大整数的乘积 */
 2 void big_mul(char a[],char b[],char ans[])
 3 {
 4     int c[N],d[N],sum[2*N],i,j,temp,lena,lenb,len_sum;
 5     lena=strlen(a); lenb=strlen(b);
 6     memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); memset(sum,0,sizeof(sum));
 7     //逆序存放
 8     for(i=0;i<lena;i++)
 9         c[lena-i-1]=a[i]-'0';
10     for(i=0;i<lenb;i++)
11         d[lenb-i-1]=b[i]-'0';
12     //
13     //模拟乘法笔算
14     for(i=0;i<lena;i++)
15     {
16         temp=0;
17         for(j=0;j<lenb;j++)
18         {
19             sum[i+j]+=c[i]*d[j]+temp;
20             temp=sum[i+j]/10;
21             sum[i+j]%=10;
22         }
23         sum[i+lenb]=temp;
24     }
25     //
26     len_sum=lena+lenb-1;
27     while(!sum[len_sum]&&len_sum)
28         len_sum--;
29     //再次逆序存放结果
30     int book=0;
31     for(i=len_sum;i>=0;i--)
32         ans[book++]=sum[i]+'0';
33 }

 

posted @ 2016-03-03 20:53  爱喝可乐的咖啡  阅读(213)  评论(0编辑  收藏  举报