高精度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 }