高精度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 } 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/7047199.html