Problem B: 大整数的加法运算 我们知道,C++中的整数类型,如short、int、long和long long等都有确定的表示范围,超大的整数是不能表示的。请定义一个类Decimal,用于表示大整数,并实现如下方法: 1.根据给出的main函数定义的构造函数。 2. 重载加法(“+”)运算符,可以实现一个Decimal对象与另一个Decimal对象求和、与一个int类型的数值求和。 3. 重载前缀自增运算符。 4. 重载下标运算符,用于求当前对象的指定下标位置的数字。 5. 重载输入、输出运算符。 Input 输入3个数,前2个可能会超出unsigned long long的表示范围,最后1个是一个int类型的非负整数。 不考虑负数。 Output 见样例。 Sample Input 876543210012345678889 123456789987654321111 15 Sample Output a = 876543210012345678889 b = 123456789987654321111 i = 15 a = 876543210012345678890 c = 1000000000000000000000 d = 876543210012345678890 e = 123456789987654321126 f = 554433 g = 12345 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 HINT
int main() { Decimal a, b, c, d, e, f("554433"), g(12345); int i; cin>>a>>b>>i; cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"i = "<<i<<endl; c = a + b; d = ++a; e = b + i; cout<<"a = "<<a<<endl; cout<<"c = "<<c<<endl; cout<<"d = "<<d<<endl; cout<<"e = "<<e<<endl; cout<<"f = "<<f<<endl; cout<<"g = "<<g<<endl; cout<<c[0]; for (i = 1; i < c.getLength(); i++) { cout<<" "<<c[i]; } cout<<endl; return 0; }AC代码
#include <bits/stdc++.h> using namespace std; static int flag=0; string to_string(int a)//OJ不支持c++11中的to_string所以这里重写 { string s; while(a>=10) { char c=a+'0'; a=a/10; s.push_back(c); } char c=a+'0'; s.push_back(c); reverse(s.begin(),s.end());//倒置 return s; } class Decimal { string s; friend istream &operator>>(istream &is,Decimal &k); friend ostream &operator<<(ostream &os,Decimal &k); friend Decimal operator+(Decimal &a ,Decimal &b); friend Decimal operator+(Decimal &a ,int b); public: Decimal(string s_){s=s_;} Decimal(){} Decimal(int s_){s=to_string(s_);} Decimal &operator++() { int m=s.size(); string temp; flag=1; for(int i=1;i<=m;i++) { int f=s[m-i]-'0'+flag; flag=0; if(f>=10) flag=1; char c=f+'0'; temp.push_back(c); } if(flag==1) temp.push_back('1'); reverse(temp.begin(),temp.end()); s=temp; return *this; } int getLength() { return s.size(); } char operator[](int i) { return s[i]; } }; Decimal operator+(Decimal &a ,Decimal &b) { Decimal t; int m=a.s.size(); int n=b.s.size(); int max=m>n?m:n; int min=m<n?m:n; for(int i=1;i<=min;i++) { int f=a.s[m-i]-'0'+b.s[n-i]-'0'+flag; flag=0; if(f>=10) flag=1; char c=f+'0'; t.s.push_back(c); } if(m>=n) { for(int i=min+1;i<=max;i++) { int f=a.s[m-i]-'0'+flag; flag=0; if(f>=10) flag=1; char c=f+'0'; t.s.push_back(c);//尾部插入字符 } if(flag==1) t.s.push_back('1'); } if(m<n) { for(int i=min+1;i<=max;i++) { int f=b.s[n-i]-'0'+flag; flag=0; if(f>=10) flag=1; char c=f+'0'; t.s.push_back(c); } if(flag==1) t.s.push_back('1'); } reverse(t.s.begin(),t.s.end()); return t; } Decimal operator+(Decimal &a ,int k) { Decimal t,b; b.s=to_string(k); int m=a.s.size(); int n=b.s.size(); int max=m>n?m:n; int min=m<n?m:n; for(int i=1;i<=min;i++) { int f=a.s[m-i]-'0'+b.s[n-i]-'0'+flag; flag=0; if(f>=10) flag=1; char c=f+'0'; t.s.push_back(c); } if(m>=n) { for(int i=min+1;i<=max;i++) { int f=a.s[m-i]-'0'+flag; flag=0; if(f>=10) flag=1; char c=f+'0'; t.s.push_back(c); } if(flag==1) t.s.push_back('1'); } if(m<n) { for(int i=min+1;i<=max;i++) { int f=b.s[n-i]-'0'+flag; flag=0; if(f>=10) flag=1; char c=f+'0'; t.s.push_back(c); } if(flag==1) t.s.push_back('1'); } reverse(t.s.begin(),t.s.end()); return t; } ostream &operator<<(ostream &os,Decimal &k) { os<<k.s; return os; } istream &operator>>(istream &is,Decimal &k) { is>>k.s; return is; } int main() { Decimal a, b, c, d, e, f("554433"), g(12345); int i; cin>>a>>b>>i; cout<<"a = "<<a<<endl; cout<<"b = "<<b<<endl; cout<<"i = "<<i<<endl; c = a + b; d = ++a; e = b + i; cout<<"a = "<<a<<endl; cout<<"c = "<<c<<endl; cout<<"d = "<<d<<endl; cout<<"e = "<<e<<endl; cout<<"f = "<<f<<endl; cout<<"g = "<<g<<endl; cout<<c[0]; for (i = 1; i < c.getLength(); i++) { cout<<" "<<c[i]; } cout<<endl; return 0; }