1、高精度数据的输入、存储数组
高精度数据每每数据长度比较长,经常使用字符数组或字符串进行输入,而后转化成int数组进行存储和操做spa
1 string sa,sb; 2 int a[200],b[200]; 3 //先所有置零,以避免高位运算错误 4 memset(a,0,200); 5 memset(b,0,200); 6 int la,lb; //长度,即位数 7 cin >> sa >> sb; 8 la = sa.length(); 9 lb = sb.length(); 10 int i; 11 //转换成int数组 12 for(i = la;i >0;i --) 13 a[i] = sa[la - i] - '0'; 14 for(i = lb;i > 0;i --) 15 b[i] = sb[lb - i] - '0';
2、高精度加法code
形式和思路相似咱们笔算加法的思路,将低位对齐,从低位向高位逐位相加,逢十进一blog
这就要求咱们在存储的时候从低位向高位存储,与平时写数字的次序相反ci
1 if(la < lb) 2 { 3 int flag = 0; //判断最终位数是本来数据中较长数据的位数仍是较长数据位数加一 4 for(i=1;i <= lb;i ++) 5 { 6 b[i] = b[i] + a[i]; 7 if(b[i]/10 != 0) 8 { 9 if(i == lb) flag = 1; 10 b[i + 1] ++; //进位 11 b[i] = b[i] % 10; 12 } 13 } 14 if(flag) 15 { 16 int zeroFlag = 0; //判断是否为零,若为零则直接输出零 17 for(i = lb+1;i > 0;i --) 18 { 19 if(b[i] != 0)zeroFlag = 1; 20 } 21 if(zeroFlag) 22 { 23 for(i = lb+1;i > 0;i --) 24 cout << b[i]; 25 } 26 else 27 { 28 cout << "0"; 29 } 30 } 31 else 32 { 33 int zeroFlag = 0; 34 for(i = lb;i > 0;i --) 35 { 36 if(b[i] != 0)zeroFlag = 1; 37 } 38 if(zeroFlag) 39 { 40 for(i = lb;i > 0;i --) 41 cout <<b[i]; 42 } 43 else 44 { 45 cout << "0"; 46 } 47 } 48 } 49 else 50 { 51 int flag = 0; 52 for(i=1;i <= la;i ++) 53 { 54 a[i] = a[i] + b[i]; 55 if(a[i]/10 != 0) 56 { 57 if(i == la) flag = 1; 58 a[i + 1] ++; //进位 59 a[i] = a[i] % 10; 60 } 61 } 62 if(flag) 63 { 64 int zeroFlag = 0; 65 for(i = la+1;i > 0;i --) 66 { 67 if(a[i] != 0)zeroFlag = 1; 68 } 69 if(zeroFlag) 70 { 71 for(i = la+1;i > 0;i --) 72 cout << a[i]; 73 } 74 else 75 { 76 cout << "0"; 77 } 78 } 79 else 80 { 81 int zeroFlag = 0; 82 for(i = la;i > 0;i --) 83 { 84 if(a[i] != 0)zeroFlag = 1; 85 } 86 if(zeroFlag) 87 { 88 for(i = la;i > 0;i --) 89 cout << a[i]; 90 } 91 else 92 { 93 cout << "0"; 94 } 95 } 96 }
3、高精度减法字符串
思路依然相似笔算减法的思路,这里先判断符号,而后用大数减去小数算出绝对值,再在输出过程当中添加符号string
从低位向高位开始减,注意借位便可class
1 int resultCompare = compare(a,b,la,lb); //a,b的比较结果 2 if(resultCompare == -1) //a,b相等,相减为0 3 { 4 cout << "0" <<endl; 5 } 6 else if(resultCompare == 1) //a>b,正 7 { 8 for(i = 1;i <= la;i ++) 9 { 10 if(a[i] >= b[i]) a[i] = a[i] - b[i]; 11 else 12 { 13 a[i] = a[i] + 10 - b[i]; 14 //借位 15 for(j = i;j <= la - 1;j ++) 16 { 17 if(a[j+1] >= 1) {a[j+1] --;break;} 18 else 19 { 20 a[j+1] = 9; 21 } 22 } 23 } 24 } 25 int zeroFlag = 0; 26 for(i = la;i > 0;i --) 27 { 28 if(!zeroFlag && a[i]!=0) 29 { 30 zeroFlag = 1; 31 } 32 if(zeroFlag) 33 cout << a[i]; 34 } 35 cout << endl; 36 } 37 else //a<b,负 38 { 39 for(i = 1;i <= lb;i ++) 40 { 41 if(b[i] > a[i]) b[i] = b[i] - a[i]; 42 else 43 { 44 b[i] = b[i] + 10 - a[i]; 45 //借位 46 for(j = i;j <= lb - 1;j ++) 47 { 48 if(b[j+1] >= 1) {b[j+1] --;break;} 49 else 50 { 51 b[j+1] = 9; 52 } 53 } 54 } 55 } 56 int zeroFlag = 0; 57 cout << "-"; 58 for(i = lb;i > 0;i --) 59 { 60 if(!zeroFlag && b[i]!=0) 61 { 62 zeroFlag = 1; 63 } 64 if(zeroFlag) 65 cout << b[i]; 66 } 67 cout <<endl; 68 } 69 70 int compare(int a[],int b[],int la,int lb) //a>b返回1;a<b返回0;a=b返回-1 71 { 72 if(la > lb) return 1;//a>b 73 else if (la < lb) return 0; //a<b 74 else 75 { 76 int i; 77 for(i = la;i > 0;i --) 78 if(a[i] > b[i]) return 1; //a>b 79 else if(a[i] < b[i]) return 0; // a<b 80 else return -1; //两者相等 81 } 82 }