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 }

 

posted @ 2017-09-18 21:59  淇洹  阅读(2364)  评论(0编辑  收藏  举报