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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM