C++大数(正整数)相加相减v1
2016-08-06 21:07
471 查看
#include<iostream> #include<string> using namespace std; bool isValid(string s) { if(s.size()==0) return false; for(int i=0;i<s.size();i++) { if(s[i]>'9' || s[i]<'0') return false; } return true; } string formatStr(string s) { if(!isValid(s)) return "0"; int i=0; for(;i<s.size();i++) { if(s[i]!='0') { break; } } if(s.size()==i) return "0"; else return s.substr(i,s.size()-i); } class BigPositiveNum { private: string val; public: BigPositiveNum(){ val="0";} BigPositiveNum(string s) { val=formatStr(s); } BigPositiveNum add(string s) { if(!isValid(s)) return *this; string s1=val.size()>s.size()?val:s;//longer one string s2=val.size()>s.size()?s:val;//shorter one string res; int p1=s1.size()-1; int p2=s2.size()-1; int takeover=0;//进位 for(;p2>=0;p2--,p1--) { int n1=s1[p1]-'0'; int n2=s2[p2]-'0'; int sum=n1+n2+takeover; if(sum<10) { takeover=0; res=(char)('0'+sum)+res; }else { takeover=1; sum=sum%10; res=(char)('0'+sum)+res; } } while(takeover&& (p1>=0)) { int sum=s1[p1]-'0'+takeover; p1--; if(sum<10) { takeover=0; res=(char)('0'+sum)+res; }else { takeover=1; sum%=10; res=(char)('0'+sum)+res; } } //string substr(int pos = 0,int n = npos) const;//返回pos开始的n个字符组成的字符串 if(takeover) res='1'+s1.substr(0,p1+1)+res; else res=s1.substr(0,p1+1)+res; return BigPositiveNum(res); } BigPositiveNum subtrt(string s) { if(!isValid(s)) return *this; s=formatStr(s); if(val==s) return BigPositiveNum(); string s1,s2; bool isNeg=false; if(val.size()<s.size() || val<s) { isNeg=true; cout<<"计算结果为负数,我们将计算差的绝对值"<<endl; s1=s;//bigger one s2=val; }else { s1=val; s2=s; } string res; int p1=s1.size()-1; int p2=s2.size()-1; int borrow=0;//借位 for(;p2>=0;p2--,p1--) { int n1=s1[p1]-'0'; int n2=s2[p2]-'0'; if(borrow) { n1--; if(n1>=n2) { borrow=0; res=(char)('0'+n1-n2)+res; }else { borrow=1; res=(char)('0'+n1+10-n2)+res; } }else { if(n1>=n2) { borrow=0; res=(char)('0'+n1-n2)+res; }else { borrow=1; res=(char)('0'+n1+10-n2)+res; } } } while(borrow&&(p1>=0)) { int n1=s1[p1]-'0'-1; p1--; if(n1>=0) { borrow=0; res=(char)('0'+n1)+res; }else { res='9'+res; } } if(p1>=0) res=s1.substr(0,p1+1)+res; return BigPositiveNum(res); } void show() { cout<<formatStr(val)<<endl; } }; int main() { cout<<"a add b"<<endl; BigPositiveNum x("9999999999999999999999999999999999999999999999999999"); (x.add("1")).show(); cout<<"a subtract b"<<endl; BigPositiveNum a("2000000000000000000000000000000000000000000000000"); (a.subtrt("2")).show(); return 0; } /*output a add b 10000000000000000000000000000000000000000000000000000 a subtract b 1999999999999999999999999999999999999999999999998 */
相关文章推荐
- C++ 值传递、指针传递、引用传递详解
- CodeForces-696C Please(数学题,快速幂取模,乘法逆元)
- C++ Primer 第10章 知识点回顾
- 链式队列的基本操作实现c++
- 顺序队列的基本操作实现c++
- 链式栈的基本操作实现c++
- 顺序栈的基本操作实现c++
- 对程序注释的理解
- 顺序容器性能比较
- 【(伪)并查集】HDU5326-Work
- C++类和对象概念
- C++编译出错discards qualifiers [-fpermissive]
- C++ string的一个误用
- C++学习之STL初理解
- c++教程(六:Basic Input/Output)
- 再见Windows C++
- GeekBand C++ 面向对象高级编程(下) 第三周笔记
- Effective C++ Item 08-别让异常逃离析构函数
- C语言求一个3*4整数矩阵中的最大元素。
- C ---边走边学 (知识点)