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 }