c++ 高精度算法
包括:
两个高精度正整数加法
两个高精度正整数乘法
两个高精度正整数减法
两个高精度正整数除法
两个高精度正整数求余
两个高精度正整数数求最大公约数
两个高精度正整数数求最小公倍数
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 }