【C++】大数の+-*/四則演算

45886 ワード

大数とは、指数値が特に大きい数で、99ビット、100ビットとなり、long longが表す範囲をはるかに超えている可能性があります.
このような数は4つの演算を行い,文字列を用いる必要がある.文字列を各文字の4則演算でシミュレートします.
 
くだらないことは言わないで、コードをつけます:
  1 #include <iostream>

  2 #include <vector>

  3 using namespace std;

  4 

  5 class BigNum{

  6     vector<char> m_vec;

  7     //    ,    ,size()  ,    >>,<<,  [] + - * / =。

  8 public:

  9     BigNum();

 10     ~BigNum();

 11 

 12 public:

 13     int size() const {

 14         return m_vec.size();

 15     }

 16     void clr(){

 17         m_vec.clear();

 18     }

 19 

 20 public:

 21     friend ostream& operator<<(ostream &os,const BigNum &data);

 22     friend istream& operator>>(istream &is,BigNum &data);

 23 

 24 public:

 25     char operator[](int nIndex) const;

 26 

 27     BigNum operator+(const BigNum &data);

 28     BigNum operator-(BigNum &data);

 29     BigNum operator*(const BigNum &data);

 30     BigNum operator/(BigNum &data);

 31     BigNum& operator=(const BigNum &data);

 32     bool operator==(const BigNum &data);

 33     bool operator>(const BigNum &data);

 34     bool operator>=(const BigNum &data);

 35 };

 36 

 37 BigNum::BigNum(){}

 38 

 39 BigNum::~BigNum(){}

 40 

 41 ostream& operator<<(ostream &os,const BigNum &data){

 42     vector<char>::const_iterator itVec = data.m_vec.begin();

 43     for(; itVec != data.m_vec.end(); itVec++){

 44         os << *itVec;

 45     }

 46     os << endl;

 47     return os;

 48 }

 49 

 50 istream& operator>>(istream &is,BigNum &data){

 51     //    is    ,  is.get()          
。 is.ignore(), ignore() 。
52 is.sync(); 53 while(true){ 54 char c = is.get(); 55 if(' ' == c || '\r' == c || '
' == c) 56 break; 57 if( c < '0' || c > '9'){ 58 data.m_vec.clear(); 59 cerr << "not accept" << endl; 60 break; 61 } 62 data.m_vec.push_back(c); 63 } 64 65 return is; 66 } 67 68 char BigNum::operator[](int nIndex) const 69 { 70 if(nIndex < 0 || nIndex >= m_vec.size()) 71 { 72 cerr << "error occur in []"; 73 return ' '; 74 } 75 return m_vec[nIndex]; 76 } 77 78 bool BigNum::operator==(const BigNum &data){ 79 if(m_vec.size() != data.m_vec.size()) 80 return false; 81 for(int i = 0; i < m_vec.size(); i++){ 82 if(m_vec[i] != data.m_vec[i]) 83 return false; 84 } 85 return true; 86 } 87 88 bool BigNum::operator>(const BigNum &data){ 89 int a = m_vec.size(); 90 int b = data.m_vec.size(); 91 if(a > b){ 92 return true; 93 } 94 else if(a < b){ 95 return false; 96 } 97 else if(a == b) 98 { 99 for(int i = 0; i < a; i++){ 100 if(m_vec[i] > data.m_vec[i]){ 101 return true; 102 } 103 else if(m_vec[i] < data.m_vec[i]){ 104 return false; 105 } 106 } 107 return false; 108 } 109 } 110 111 bool BigNum::operator>=(const BigNum &data){ 112 if(*this > data || *this == data) 113 return true; 114 return false; 115 } 116 117 BigNum BigNum::operator+ (const BigNum &data){ 118 int nCarry = 0; 119 BigNum numTemp; 120 vector<char>& vecTemp = numTemp.m_vec; // 121 122 int i = data.size() - 1; 123 int j = m_vec.size() -1; 124 for(; i >= 0 || j >= 0; i--,j--){ 125 char a = j>=0? m_vec[j] - '0': 0; 126 char b = i>=0? data[i] - '0' :0; 127 char c = a + b + nCarry; 128 nCarry = c / 10; 129 vecTemp.push_back(c%10 + '0'); 130 } 131 132 if(nCarry != 0) 133 { 134 vecTemp.push_back(nCarry + '0'); 135 } 136 137 //reverse vecTemp 138 for(i = 0, j = vecTemp.size() - 1; i < j; i++,j--) 139 { 140 char cTemp = vecTemp[i]; 141 vecTemp[i] = vecTemp[j]; 142 vecTemp[j] = cTemp; 143 } 144 return numTemp; 145 } 146 147 BigNum& BigNum::operator=(const BigNum &data) 148 { 149 m_vec.clear(); 150 vector<char>::const_iterator itVec = data.m_vec.begin(); 151 for(; itVec != data.m_vec.end(); itVec++) 152 { 153 m_vec.push_back(*itVec); 154 } 155 return *this; 156 } 157 158 BigNum BigNum::operator*(const BigNum &data){ 159 int nCarry = 0; 160 BigNum result; 161 BigNum numTemp; 162 vector<char>& vecTemp = numTemp.m_vec; 163 164 int i = data.size()-1; 165 for(; i >= 0; i--){ 166 char a = data[i] - '0'; 167 int j = m_vec.size() - 1; 168 for(; j >= 0; j--){ 169 char b = m_vec[j] - '0'; 170 char c = b * a + nCarry; 171 nCarry = c/10; 172 vecTemp.push_back(c % 10 + '0'); 173 } 174 if(nCarry != 0){ 175 vecTemp.push_back(nCarry + '0'); 176 nCarry = 0; 177 } 178 179 //reverse vecTemp 180 int n = 0; 181 int m = vecTemp.size() - 1; 182 for(; n < m; n++,m--){ 183 char cTemp = vecTemp[n]; 184 vecTemp[n] = vecTemp[m]; 185 vecTemp[m] = cTemp; 186 } 187 188 for(int t = data.size() - 1; t > i; t--) 189 { 190 vecTemp.push_back('0'); 191 } 192 193 result = result + numTemp; 194 vecTemp.clear(); 195 } 196 return result; 197 } 198 199 BigNum BigNum::operator-(BigNum &data){ 200 //m_vec > data.m_vec 201 int nCarry = 0; 202 BigNum numTemp; 203 vector<char>& vecTemp = numTemp.m_vec; 204 205 int i = data.size() - 1; 206 int j = m_vec.size() -1; 207 for(; i >= 0 || j >= 0; i--,j--){ 208 char a = j>=0? m_vec[j] - '0': 0; 209 char b = i>=0? data[i] - '0' :0; 210 char c = a - nCarry; 211 if(c < b){ 212 // 213 c = c + 10; 214 nCarry = 1; 215 vecTemp.push_back( (c-b) + '0'); 216 } 217 else{ 218 nCarry = 0; 219 vecTemp.push_back( (c-b) + '0'); 220 } 221 } 222 223 // 0 224 int zero = 0; 225 vector<char>::const_iterator itVec = vecTemp.end()-1; 226 for(; ; itVec--){ 227 if( *itVec == '0'){ 228 zero++; 229 } 230 else 231 break; 232 if(itVec == vecTemp.begin()) 233 break; 234 } 235 236 //pop 0 237 for(int k = zero; k > 0; k--) 238 vecTemp.pop_back(); 239 240 //reverse 241 for(i = 0, j = vecTemp.size() - 1; i < j; i++,j--) 242 { 243 char cTemp = vecTemp[i]; 244 vecTemp[i] = vecTemp[j]; 245 vecTemp[j] = cTemp; 246 } 247 248 return numTemp; 249 } 250 251 BigNum BigNum::operator/(BigNum &data){ 252 //m_vec > data.m_vec 253 BigNum numTemp; 254 vector<char>& vecTemp = numTemp.m_vec; 255 BigNum &numThis = *this; 256 257 int lenA = m_vec.size(); 258 int lenB = data.m_vec.size(); 259 for (int i = lenB; i < lenA; i++){ 260 data.m_vec.push_back('0'); 261 } 262 for(int j = lenB; j <= lenA; j++){ 263 int a = 0; 264 while(numThis >= data){ 265 numThis = numThis - data; 266 a++; 267 } 268 vecTemp.push_back( a + '0'); 269 data.m_vec.pop_back(); 270 } 271 return numTemp; 272 } 273 274 int main() 275 { 276 BigNum numA; 277 BigNum numB; 278 BigNum numC; 279 char opt; 280 while(1){ 281 cin >> numA; 282 cin >> opt; 283 cin >> numB; 284 285 switch(opt){ 286 case '+': 287 numC = numA + numB; 288 cout << numC; 289 break; 290 case '-': 291 if(numA == numB){ 292 cout << 0 << endl; 293 } 294 else if(numA > numB){ 295 numC = numA - numB; 296 cout << numC; 297 } 298 else{ 299 numC = numB - numA; 300 cout << '-'; 301 cout << numC; 302 } 303 break; 304 case '*': 305 numC = numA * numB; 306 cout << numC; 307 break; 308 case '/': 309 if(numA == numB){ 310 cout << 1 << endl; 311 } 312 else if(numA > numB){ 313 numC = numA / numB; 314 cout << numC; 315 } 316 else{ 317 cout << 0 << endl; 318 } 319 break; 320 } 321 // numA,numB。 322 numA.clr(); 323 numB.clr(); 324 numC.clr(); 325 } 326 return 0; 327 }