一、高精度数据的输入、存储
高精度数据往往数据长度比较长,常用字符数组或字符串进行输入,然后转化成int数组进行存储和操作
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';
二、高精度加法
形式和思路类似我们笔算加法的思路,将低位对齐,从低位向高位逐位相加,逢十进一
这就要求我们在存储的时候从低位向高位存储,与平时写数字的次序相反
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 else27 {28 cout << "0";29 }30 }31 else32 {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 < <= 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 else75 {76 cout << "0";77 }78 }79 else80 {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 else92 {93 cout << "0";94 }95 }96 }
三、高精度减法
思路依然类似笔算减法的思路,这里先判断符号,然后用大数减去小数算出绝对值,再在输出过程中添加符号
从低位向高位开始减,注意借位即可
1 int resultCompare = compare(a,b,la,lb); //a,b的比较结果 2 if(resultCompare == -1) //a,b相等,相减为0 3 { 4 cout << "0" <b,正 7 { 8 for(i = 1;i <= la;i ++) 9 {10 if(a[i] >= b[i]) a[i] = a[i] - b[i];11 else12 {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 else19 {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 <= lb;i ++)40 {41 if(b[i] > a[i]) b[i] = b[i] - a[i];42 else43 {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 else50 {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 < b返回1;a lb) return 1;//a>b73 else if (la < lb) return 0; //a 0;i --)78 if(a[i] > b[i]) return 1; //a>b79 else if(a[i] < b[i]) return 0; // a