【C++】大数的+-*/四则运算
2014-04-07 16:50
387 查看
所谓大数,则指数值特别大的数,可能会有99位,100位,远远超过了long long表示的范围。
这样的数作四则运算,需要用到字符串。用字符串通过每一位的字符的四则运算来模拟。
废话少说,上代码:
这样的数作四则运算,需要用到字符串。用字符串通过每一位的字符的四则运算来模拟。
废话少说,上代码:
#include <iostream> #include <vector> using namespace std; class BigNum{ vector<char> m_vec; //构造函数,析构函数,size()函数,友元重载>>,<<,重载[] + - * / =。 public: BigNum(); ~BigNum(); public: int size() const { return m_vec.size(); } void clr(){ m_vec.clear(); } public: friend ostream& operator<<(ostream &os,const BigNum &data); friend istream& operator>>(istream &is,BigNum &data); public: char operator[](int nIndex) const; BigNum operator+(const BigNum &data); BigNum operator-(BigNum &data); BigNum operator*(const BigNum &data); BigNum operator/(BigNum &data); BigNum& operator=(const BigNum &data); bool operator==(const BigNum &data); bool operator>(const BigNum &data); bool operator>=(const BigNum &data); }; BigNum::BigNum(){} BigNum::~BigNum(){} ostream& operator<<(ostream &os,const BigNum &data){ vector<char>::const_iterator itVec = data.m_vec.begin(); for(; itVec != data.m_vec.end(); itVec++){ os << *itVec; } os << endl; return os; } istream& operator>>(istream &is,BigNum &data){ //必须清空is的缓冲区,不然is.get()得到的是上一次回车的\n。并且不能用is.ignore(),因为ignore()会把第一次输入的第一个字符删除掉。 is.sync(); while(true){ char c = is.get(); if(' ' == c || '\r' == c || '\n' == c) break; if( c < '0' || c > '9'){ data.m_vec.clear(); cerr << "not accept" << endl; break; } data.m_vec.push_back(c); } return is; } char BigNum::operator[](int nIndex) const { if(nIndex < 0 || nIndex >= m_vec.size()) { cerr << "error occur in []"; return ' '; } return m_vec[nIndex]; } bool BigNum::operator==(const BigNum &data){ if(m_vec.size() != data.m_vec.size()) return false; for(int i = 0; i < m_vec.size(); i++){ if(m_vec[i] != data.m_vec[i]) return false; } return true; } bool BigNum::operator>(const BigNum &data){ int a = m_vec.size(); int b = data.m_vec.size(); if(a > b){ return true; } else if(a < b){ return false; } else if(a == b) { for(int i = 0; i < a; i++){ if(m_vec[i] > data.m_vec[i]){ return true; } else if(m_vec[i] < data.m_vec[i]){ return false; } } return false; } } bool BigNum::operator>=(const BigNum &data){ if(*this > data || *this == data) return true; return false; } BigNum BigNum::operator+ (const BigNum &data){ int nCarry = 0; BigNum numTemp; vector<char>& vecTemp = numTemp.m_vec; //必须是引用 int i = data.size() - 1; int j = m_vec.size() -1; for(; i >= 0 || j >= 0; i--,j--){ char a = j>=0? m_vec[j] - '0': 0; char b = i>=0? data[i] - '0' :0; char c = a + b + nCarry; nCarry = c / 10; vecTemp.push_back(c%10 + '0'); } if(nCarry != 0) { vecTemp.push_back(nCarry + '0'); } //reverse vecTemp for(i = 0, j = vecTemp.size() - 1; i < j; i++,j--) { char cTemp = vecTemp[i]; vecTemp[i] = vecTemp[j]; vecTemp[j] = cTemp; } return numTemp; } BigNum& BigNum::operator=(const BigNum &data) { m_vec.clear(); vector<char>::const_iterator itVec = data.m_vec.begin(); for(; itVec != data.m_vec.end(); itVec++) { m_vec.push_back(*itVec); } return *this; } BigNum BigNum::operator*(const BigNum &data){ int nCarry = 0; BigNum result; BigNum numTemp; vector<char>& vecTemp = numTemp.m_vec; int i = data.size()-1; for(; i >= 0; i--){ char a = data[i] - '0'; int j = m_vec.size() - 1; for(; j >= 0; j--){ char b = m_vec[j] - '0'; char c = b * a + nCarry; nCarry = c/10; vecTemp.push_back(c % 10 + '0'); } if(nCarry != 0){ vecTemp.push_back(nCarry + '0'); nCarry = 0; } //reverse vecTemp int n = 0; int m = vecTemp.size() - 1; for(; n < m; n++,m--){ char cTemp = vecTemp ; vecTemp = vecTemp[m]; vecTemp[m] = cTemp; } for(int t = data.size() - 1; t > i; t--) { vecTemp.push_back('0'); } result = result + numTemp; vecTemp.clear(); } return result; } BigNum BigNum::operator-(BigNum &data){ //m_vec > data.m_vec int nCarry = 0; BigNum numTemp; vector<char>& vecTemp = numTemp.m_vec; int i = data.size() - 1; int j = m_vec.size() -1; for(; i >= 0 || j >= 0; i--,j--){ char a = j>=0? m_vec[j] - '0': 0; char b = i>=0? data[i] - '0' :0; char c = a - nCarry; if(c < b){ //需要借位 c = c + 10; nCarry = 1; vecTemp.push_back( (c-b) + '0'); } else{ nCarry = 0; vecTemp.push_back( (c-b) + '0'); } } //记录前面产生几个0 int zero = 0; vector<char>::const_iterator itVec = vecTemp.end()-1; for(; ; itVec--){ if( *itVec == '0'){ zero++; } else break; if(itVec == vecTemp.begin()) break; } //pop掉0 for(int k = zero; k > 0; k--) vecTemp.pop_back(); //reverse for(i = 0, j = vecTemp.size() - 1; i < j; i++,j--) { char cTemp = vecTemp[i]; vecTemp[i] = vecTemp[j]; vecTemp[j] = cTemp; } return numTemp; } BigNum BigNum::operator/(BigNum &data){ //m_vec > data.m_vec BigNum numTemp; vector<char>& vecTemp = numTemp.m_vec; BigNum &numThis = *this; int lenA = m_vec.size(); int lenB = data.m_vec.size(); for (int i = lenB; i < lenA; i++){ data.m_vec.push_back('0'); } for(int j = lenB; j <= lenA; j++){ int a = 0; while(numThis >= data){ numThis = numThis - data; a++; } vecTemp.push_back( a + '0'); data.m_vec.pop_back(); } return numTemp; } int main() { BigNum numA; BigNum numB; BigNum numC; char opt; while(1){ cin >> numA; cin >> opt; cin >> numB; switch(opt){ case '+': numC = numA + numB; cout << numC; break; case '-': if(numA == numB){ cout << 0 << endl; } else if(numA > numB){ numC = numA - numB; cout << numC; } else{ numC = numB - numA; cout << '-'; cout << numC; } break; case '*': numC = numA * numB; cout << numC; break; case '/': if(numA == numB){ cout << 1 << endl; } else if(numA > numB){ numC = numA / numB; cout << numC; } else{ cout << 0 << endl; } break; } //清空numA,numB。 numA.clr(); numB.clr(); numC.clr(); } return 0; }
相关文章推荐
- 高精度(大数)的四则运算与逻辑运算---c++ struct版
- 分数的四则运算(c++重载练习)
- 软件工程课程作业(三)--四则运算3(C++)
- 大数字符串的四则运算之加法----Java代码实现
- c++实现大数的加减乘运算(数组存放)
- 大数的四则运算
- 对于c++来说,最简单的就是四则运算了,这里有一个四则运算的计算器
- 软件工程课堂作业(一)——随机产生四则运算题目(C++)
- C++实现计算器(四则混合运算)
- C++中的大数运算
- 大数的四则运算(转)
- 分别用C++和JavaScript 实现四则运算表达式求值
- 四则混合运算C++代码(中缀表达式)
- c++实现重载分数的四则运算
- 大数运算c++
- 四则运算出题器(C++)-BUG修复
- 实数四则运算表达式的计算,C++ 实现
- C++实现大数运算 加法部分。
- ZOJ 1205题解本来是一道大数运算水题,可是却纠结了很久,原因是没能真正读懂题意,要求的计算必须是一一对应输出即使前面出现几个0最后也要把前面的0输出,看别人用C++自己还是两个都提交了结果还是C占的内存少。
- C++ 一个简单的解释器 - 四则运算