• 高精度2--减法


    高精度2--减法

    一、心得

    其实自己写之后会发现自己的思想和那些人给的思想差不多

    自己先写然后再对照区看那些代码效果会好很多

    /*

    1、相等置为0,小置为-1,大为1

    2、我的代码输出那里需要考虑两数相等,也就是a[0]==0的情况

    3、小于的情况用 则用a=b-a,返回-1,则不需要交换a,b 

    4、修正a的位数:while(a[0]>0&&a[a[0]]==0) a[0]--; //修正a的位数 

    */

    二、代码及结果

    自己代码

     1 /*
     2 减minus
     3 高精度减法
     4 1、逆序存储 
     5 2、比较减数和被减数的大小,用大数去减小数,如果被减数小,则补负号
     6 3、借位相减
     7 4、输出结果 
     8 */ 
     9 #include <iostream>
    10 #include <string>
    11 #define Max 105 
    12 using namespace std;
    13 //传入数字字符串并将其逆序放在int数组中 
    14 int init(string s,int (&a)[Max]){
    15     a[0]=s.length();
    16     for(int i=a[0],j=0;i>=1;i--,j++){
    17         a[i]=s[j]-'0';
    18     }
    19 } 
    20 //输出逆序数组的内容
    21 int printArray(int a[Max]){
    22     for(int i=a[0];i>=1;i--){
    23         cout<<a[i];
    24     }
    25     cout<<endl;
    26 } 
    27 //比较大小,a数组大于b数组返回true,否则返回false 
    28 bool isFirstBig(int a[Max],int b[Max]){
    29     if(a[0]>b[0]) return true;
    30     if(a[0]<b[0]) return false;
    31     if(a[0]==b[0]){
    32         for(int i=a[0];i>=1;i--){
    33             if(a[i]>b[i]) return true;
    34             if(a[i]<b[i]) return false;
    35         }
    36     } 
    37     //如果相等的情况,返回true 
    38     return true;
    39 } 
    40 //进行高精度相减的操作
    41 void minusOperation(int (&a)[Max],int (&b)[Max]){
    42     int firstBig=isFirstBig(a,b);
    43     //如果被减数大,则输出负号并交换a,b 
    44     if(!firstBig){ 
    45         cout<<"-";
    46         int c[Max];
    47         //交换a,b 
    48         for(int i=1;i<=b[0];i++){
    49             c[i]=a[i];
    50             a[i]=b[i];
    51             b[i]=c[i];
    52         }
    53     }
    54 
    55     for(int i=1;i<=a[0];i++){
    56         a[i]-=b[i];
    57         if(a[i]<0){
    58             a[i+1]--;//向高位借位
    59             a[i]=10+a[i]; 
    60         }
    61     }
    62     //减法操作后去掉前面多余的0,并且修改位数 
    63     for(int i=a[0];i>=1;i--){
    64         if(a[i]==0) a[0]--;
    65         else break;
    66     }
    67 
    68     
    69 } 
    70 int main(){
    71     int a[Max]={0},b[Max]={0};
    72     string s1="221423423132141313412";
    73     string s2="987654321012345678909";
    74     init(s1,a);
    75     init(s2,b);
    76     cout<<"被减数"<<endl; 
    77     printArray(a);//打印被减数 
    78     cout<<"减数"<<endl; 
    79     printArray(b);//打印减数 
    80     minusOperation(a,b);    
    81     printArray(a);//打印结果 
    82     return 0;
    83 } 

    给的标准代码

    /*

    1、相等置为0,小置为-1,大为1

    2、我的代码输出那里需要考虑两数相等,也就是a[0]==0的情况

    3、小于的情况用 则用a=b-a,返回-1,则不需要交换a,b 

    4、修正a的位数:while(a[0]>0&&a[a[0]]==0) a[0]--; //修正a的位数 

    */

     1 int compare(int a[],int b[]) 
     2      //比较a和b的大小关系,若a>b则为1,a<b则为-1,a=b则为0 
     3 {   int i; 
     4      if(a[0]>b[0])return 1;  //a的位数大于b则a比b大 
     5      if(a[0]<b[0])return -1;  //a的位数小于b则a比b小 
     6      for(i=a[0];i>=1;i--)  //否则a和b的位数相同,则从高位到低位比较 
     7      {    if(a[i]>b[i])return 1; 
     8            if(a[i]<b[i])return -1;
     9      } 
    10      return 0;//各位都相等则两数相等。 
    11 } 
    12 //思想:先判断大小,分情况用大数减小数的原则;
    13 void jian(int a[],int b[])//计算a=a-b
    14 {   int flag,i; 
    15     flag=compare(a,b); //调用比较函数判断大小 
    16     if (flag==0) {a[0]=0;return;} //相等 
    17     if(flag==1) //大于   
    18     {    for(i=1;i<=a[0];i++) 
    19           {   if(a[i]<b[i]){ a[i+1]--;a[i]+=10;} //若不够减则向上借一位 
    20                a[i]=a[i]-b[i];
    21           } 
    22           while(a[0]>0&&a[a[0]]==0) a[0]--; //修正a的位数 
    23           return;
    24     } 
    25     if (flag==-1)//小于  则用a=b-a,返回-1 
    26     {   cout<<"-"; 
    27         for(i=1;i<=b[0];i++)
    28          {    if(b[i]<a[i]){b[i+1]--;b[i]+=10;} //若不够减则向上借一位 
    29                a[i]=b[i]-a[i];
    30          } 
    31          a[0]=b[0]; 
    32          while(a[0]>0&&a[a[0]]==0) a[0]--; //修正a的位数 
    33          return;
    34    } 
    35 } 
  • 相关阅读:
    整理了一份FAQ,新手看一下
    分享:pythonbitstring 3.1.2 发布
    分享:TokuDB v7 发布,并宣布全面开源
    在美国学CS能挣多少钱?美国IT公司标准 offer package详细数字及绿卡政策 | 美国留学申请与就业找工作咨询博客|Warald|一亩三分地论坛
    写的split带改进
    分享:一个多进程并发执行程序ps命令 ls命令
    分享:vi/vim使用进阶: 指随意动,移动如飞 (一)
    waning rm i rm rvfi
    分享:C++中头文件、源文件之间的区别与联系
    分享:神奇的动归状态转移方程——最优子序列
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7047199.html
Copyright © 2020-2023  润新知