zoukankan      html  css  js  c++  java
  • 高精度运算专题2-减法运算(The subtraction operation)

    这个专题呢,我就来讲讲高精度的减法,下面是三个计算减法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面

    函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了。

    ①记录数组a、数组b、数组c的长度,放到第一位

    ②比较数组a和数组b的大小(长度长的大),如果大,交换也

    ③从前往后扫描数组a和数组b,每一位相减,如果数组a中的那一位<数组b中的那一位,就要借位(十位加十),再相减,存入数组c

    注释:最后返回的ans是数组a与b的大小,-1则小,0则等,1则大

    代码如下:

     1 int sub(char strA[],char strB[],int c[])
     2 //两个高精度的正整数a、b,计算a-b,结果放在c。
     3 //c>0返回1;c==0返回0,c<0返回-1 
     4 {
     5     char t[MaxLength];
     6     int a[MaxLength]={0},b[MaxLength]={0};
     7     int ans=1,i;
     8     int lenA,lenB,lenC,temp;
     9     memset(c,0,sizeof(c));
    10     lenA=strlen(strA);
    11     lenB=strlen(strB);
    12     if(  lenA<lenB  ||  (  lenA==lenB  &&  strcmp(strA,strB)<0  )  )
    13     {
    14         strcpy(t,strA);
    15         strcpy(strA,strB);
    16         strcpy(strB,t);
    17         ans=-1;
    18     }
    19     else if(strcmp(strA,strB)==0)
    20     {
    21         ans=0;
    22         c[0]=1;
    23         return ans;
    24     }
    25     init(strA,a);//从低位到高位存储
    26     init(strB,b);//从低位到高位存储
    27     i=1;
    28     while(i<=a[0]||i<=b[0])
    29     {
    30         if(a[i]<b[i])//借位 
    31         {
    32             a[i]+=10;
    33             a[i+1]--;
    34         }
    35         c[i]=a[i]-b[i];//注意:现在的C数组是从低位到高位存储的。 
    36         i++;
    37     }
    38     lenC=i;
    39     while((c[lenC]==0)&&(lenC>1)) lenC--;//最高位的0不输出
    40      c[0]=lenC;
    41     return ans;
    42 }

    函数2思路:这个减法函数和函数1差不多的,只是省去了把字符串转换成数字的部分

    代码如下:

     1 int sub2(int a[],int b[],int c[])// 输入高精度正整数a和b,计算a-b,结果存储在c。  c>0返回1;c==0返回0,c<0返回-1 
     2 {
     3     int ans,i,temp,len;
     4     int lenC;
     5     memset(c,0,sizeof(c));
     6     
     7     ans=cmp(a,b);
     8     if(ans==0)
     9     {
    10         c[0]=1;
    11         c[1]=0;
    12         return ans;
    13     }
    14     else if(ans == -1)
    15     {//这里是表示a<b时要交换a和b 
    16         len=( a[0]>b[0] ? a[0] : b[0] );
    17         for(i=0;i<=len;i++)
    18         {
    19             temp=a[i];a[i]=b[i];b[i]=temp;
    20         }
    21     }
    22     //下面开始做减法操作 
    23     i=1;
    24     while(i<=a[0]||i<=b[0])
    25     {
    26         if(a[i]<b[i])
    27         {
    28             a[i]+=10;
    29             a[i+1]--;
    30         }
    31         c[i]=a[i]-b[i];//注意:现在的C数组是从低位到高位存储的。 
    32         i++;
    33     }
    34     lenC=i;
    35     while((c[lenC]==0)&&(lenC>1)) lenC--;//消除高位无意义的0 
    36      c[0]=lenC;
    37     return ans;
    38 }

    函数3思路:这个函数优化了函数2,不用再开一个数组,大大地节省了时间

    ①首先得把数组a和数组b的长度分别存入a[0]、b[0]

    ②做减法,不够十要借位,十位数要加10,减去不够减的数

    ③最重要的一步:高位可能会有很多0,记得要消去

    代码如下:

     1 int sub3(int a[],int b[])//a=a-b 。   计算结果 a>0返回1;a==0返回0,a<0返回-1
     2 {
     3     int ans,i,temp,len;
     4     int lenA;
     5     ans=cmp(a,b);
     6     if(ans==0)
     7     {
     8         a[0]=1;
     9         a[1]=0;
    10         return ans;
    11     }
    12     else if(ans==-1)
    13     {
    14         len=( a[0]>b[0] ? a[0] : b[0] );//这里是表示a<b时要交换a和b 
    15         for(i=0;i<=len;i++)//排序 
    16         {
    17             temp=a[i];
    18             a[i]=b[i];
    19             b[i]=temp;
    20         }
    21     }
    22     //下面开始做减法操作 
    23     i=1;
    24     while(i<=a[0]||i<=b[0])
    25     {
    26         if(a[i]<b[i])//借位 
    27         {
    28             a[i]+=10;
    29             a[i+1]--;
    30         }
    31         a[i]=a[i]-b[i];//注意:现在的a数组是从低位到高位存储的。 
    32         i++;
    33     }
    34     lenA=i;
    35     while((a[lenA]==0)&&(lenA>1)) lenA--;//消除高位无意义的0 
    36      a[0]=lenA;
    37     return ans;
    38 }

     函数4思路:这个函数优化了函数3,a=a-b,a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程 

    代码如下:

     1 int sub4(int a[],int b[])//a=a-b 。a>0返回1,a==0返回0,a<0返回-1,不过这个地方默认a>=b,主要是用于除法的操作过程 
     2 {
     3     int ans,i,temp,len;
     4     int lenA;
     5     
     6     ans=cmp(a,b);
     7     if(ans==0)
     8     {
     9         a[0]=1;
    10         a[1]=0;
    11         return ans;
    12     }
    13     else if(ans==1)
    14     {
    15         //下面开始做减法操作 
    16         i=1;
    17         while(i<=a[0])
    18         {
    19             if(a[i]<b[i])
    20             {
    21                 a[i]+=10;
    22                 a[i+1]--;
    23             }
    24             a[i]=a[i]-b[i];//注意:现在的a数组是从低位到高位存储的。 
    25             i++;
    26         }
    27         lenA=i;
    28         while((a[lenA]==0)&&(lenA>1)) lenA--;//消除高位无意义的0 
    29          a[0]=lenA;
    30     }
    31     return ans;
    32 }
  • 相关阅读:
    JS-函数
    JS-数组
    JS-2
    课堂小技巧
    CSS利用filter/opacity实现背景透明
    [技巧心得] 背景半透明最佳实践
    Cadence Orcad 无法启动出现Capture.exe找不到cdn_sfl401as.dll问题
    正则表达式
    python小项目之头像右上角加数字
    Django开发之路 二(django的models表查询)
  • 原文地址:https://www.cnblogs.com/geek-007/p/4357007.html
Copyright © 2011-2022 走看看