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


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

     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 }
  • 相关阅读:
    【2020-01-28】陪伴即陪伴,擦汗即擦汗
    【2020-01-27】曼巴走了,但他还在
    【2020-01-26】今年,远亲不如近邻了
    【2020-01-25】新的一年,新的传统
    【2020-01-24】上天为这小女孩开了一扇小小窗
    【2020-01-23】故作假装的毛病
    day 31 html(二) 和css入门
    前端 day 30 html 基础一
    day 17python 面对对象之继承
    多并发编程基础 之协成
  • 原文地址:https://www.cnblogs.com/geek1116/p/5240037.html
Copyright © 2020-2023  润新知