c++ 高精度算法
阿新 • • 發佈:2017-09-19
bigger substring -s 公倍數 其他 清除 style 整數加法 ()
包括:
兩個高精度正整數加法
兩個高精度正整數乘法
兩個高精度正整數減法
兩個高精度正整數除法
兩個高精度正整數求余
兩個高精度正整數數求最大公約數
兩個高精度正整數數求最小公倍數
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 //清除前綴0,如果結果是空字符串則設為0 7 inline void clear(string& a){ 8 while(a.length()>0 && a[0]==‘0‘) 9 a.erase(0, 1); 10 if(a == "") 11 a = "0"; 12 } 13 14 //如果a>=b則返回真(如果包含前綴零會被消除) 15 bool isBigger(string a, string b){ 16 clear(a); 17 clear(b); 18 if(a.length() > b.length()) 19 return true; 20 if(a.length()==b.length() && a>=b)21 return true; 22 return false; 23 } 24 25 26 //兩個高精度正整數加法 a+b 27 string stringAddString(string a, string b){ 28 //1、對位,將兩個數補零直到其具有相同長度 29 while(a.length() < b.length()) 30 a = ‘0‘ + a; 31 while(a.length() > b.length()) 32 b = ‘0‘ + b;33 //2、補零,在開頭再加一個0以便進位 34 a = ‘0‘ + a; 35 b = ‘0‘ + b; 36 //3、從低位開始相加,註意進位 37 for(int i=a.length()-1; i>=0; i--){ 38 a[i] = a[i] + b[i] - ‘0‘; 39 if(a[i] > ‘9‘){ 40 a[i] = a[i] - 10; 41 a[i-1] += 1; 42 } 43 } 44 clear(a); 45 return a; 46 } 47 48 //兩個高精度正整數減法 a-b 49 string stringSubString(string a, string b){ 50 bool aBigger = true; 51 //1、對位,將兩個數補零直到其具有相同長度 52 while(a.length() < b.length()) 53 a = ‘0‘ + a; 54 while(a.length() > b.length()) 55 b = ‘0‘ + b; 56 //2、推測結果正負值,調整為前大後小 57 if(a < b) 58 { 59 aBigger = false; 60 string buf = b; 61 b = a; 62 a = buf; 63 } 64 //3、從低位開始相減,註意借位 65 for(int i=a.length()-1; i>=0; i--){ 66 if(a[i] >= b[i]){ 67 a[i] = a[i] - (b[i] - ‘0‘); 68 }else{ 69 a[i] = a[i] + 10; 70 a[i-1] -= 1; 71 a[i] = a[i] - (b[i] - ‘0‘); 72 } 73 } 74 clear(a); 75 if(!aBigger) 76 a = ‘-‘ + a; 77 return a; 78 } 79 80 //兩個高精度正整數乘法 a*b 81 //依賴加法 82 string stringMultString(string a, string b){ 83 string result = "0"; 84 if(a.length() < b.length()){ 85 string buf = a; 86 a = b; 87 b = buf; 88 } 89 //多位數乘一位數可以直接使用加法 90 //多位數乘以形如d*10^n的數可以轉化為多位數乘以一位數 91 //多位數乘以多位數可以轉化為若幹個多位數乘以一位數相加 92 for(int i=b.length()-1; i>=0; i--){ 93 for(int j=0; j<b[i]-‘0‘; j++){ 94 result = stringAddString(result, a); 95 } 96 a = a + ‘0‘; 97 } 98 clear(result); 99 return result; 100 } 101 102 //兩個高精度正整數除法 a/b 103 //依賴減法 104 string stringDivString(string a, string b){ 105 clear(a); 106 clear(b); 107 if(b == "0") 108 return "Error!"; 109 110 string result = ""; 111 string remainder = ""; 112 //從高位開始除,和手算除法一樣 113 // 一旦取位剛好大於被除數則開始用減法求商 114 for(int i=0; i<a.length(); i++){ 115 remainder = remainder + a[i]; 116 result = result + ‘0‘; 117 while(isBigger(remainder, b)){ 118 result[result.length()-1]++; 119 remainder = stringSubString(remainder, b); 120 } 121 } 122 clear(result); 123 return result; 124 } 125 126 //兩個高精度正整數求余 a%b 127 //依賴減法 128 string stringModString(string a, string b){ 129 clear(a); 130 clear(b); 131 if(b == "0") 132 return "Error!"; 133 134 string result = ""; 135 string remainder = ""; 136 //和除法唯一的區別就是返回值不一樣 137 for(int i=0; i<a.length(); i++){ 138 remainder = remainder + a[i]; 139 result = result + ‘0‘; 140 while(isBigger(remainder, b)){ 141 result[result.length()-1]++; 142 remainder = stringSubString(remainder, b); 143 } 144 } 145 clear(remainder); 146 return remainder; 147 } 148 149 //兩個高精度數求最大公約數 gcd(a,b) 150 //依賴求余 151 string stringGcd(string a, string b){ 152 clear(a); 153 clear(b); 154 if(!isBigger(a, b)){ 155 string buf = a; 156 a = b; 157 b = buf; 158 } 159 //使用輾轉相除法求最大公約數 160 if(b == "0"){ 161 return a; 162 }else{ 163 return stringGcd(b, stringModString(a, b)); 164 } 165 } 166 167 //兩個高精度數求最小公倍數 lcm(a,b) 168 //依賴乘法 169 //依賴除法 170 //依賴最大公約數 171 string stringLcm(string a, string b){ 172 clear(a); 173 clear(b); 174 string buf = stringMultString(a, b); 175 //使用公式 lcm(a,b)=a*b/gcd(a,b) 176 if(buf == "0"){ 177 return "0"; 178 }else{ 179 return stringDivString(buf, stringGcd(a, b)); 180 } 181 } 182 183 int main() 184 { 185 string choose; 186 string a, b; 187 while (1){ 188 cout << "請輸入兩個正整數:"; 189 cin >> a >> b; 190 cout << "a + b = " << stringAddString(a, b) << endl 191 << "a - b = " << stringSubString(a, b) << endl 192 << "a * b = " << stringMultString(a, b) << endl 193 << "a / b = " << stringDivString(a, b) << endl 194 << "a % b = " << stringModString(a, b) << endl 195 << "gcd(a, b) = " << stringGcd(a, b) << endl 196 << "lcm(a, b) = " << stringLcm(a, b) << endl; 197 cout << "輸入\"q\"退出,人以其他字符繼續:"; 198 cin >> choose; 199 if(choose == "q") 200 break; 201 } 202 return 0; 203 }
c++ 高精度算法