C++ 实现大整数类运算符重载

018:别叫,这个大整数已经很简化了!

  • 查看
  • 提交
  • 统计
  • 提问

总时间限制: 

1000ms

 

内存限制: 

65536kB

// 在此处补充你的代码

描述

程序填空,输出指定结果

#include  
#include  
#include  
#include  
using namespace std;
const int MAX = 110; 
class CHugeInt {
};
int  main() 
{ 
	char s[210];
	int n;

	while (cin >> s >> n) {
		CHugeInt a(s);
		CHugeInt b(n);

		cout << a + b << endl;
		cout << n + a << endl;
		cout << a + n << endl;
		b += n;
		cout  << ++ b << endl;
		cout << b++ << endl;
		cout << b << endl;
	}
	return 0;
}

输入

多组数据,每组数据是两个非负整数s和 n。s最多可能200位, n用int能表示

输出

对每组数据,输出6行,内容分别是:

样例输入

99999999999999999999999999888888888888888812345678901234567789 12
6 6

样例输出

99999999999999999999999999888888888888888812345678901234567801
99999999999999999999999999888888888888888812345678901234567801
99999999999999999999999999888888888888888812345678901234567801
25
25
26
12
12
12
13
13
14

来源

Guo Wei

这里有点难,涉及到大整数算法,和运算符重载

#include  
#include  
#include  
#include  
using namespace std;
const int MAX = 110;
class CHugeInt {
	// 在此处补充你的代码
private:
	char num_[220];                   // 不需要动态分配内存
public:

	void reverse(char *p)             // 标准字符串原地逆序
	{
		int len = strlen(p);
		int i = 0, j = len - 1;
		while (i <= j)
		{
			swap(p[i], p[j]);
			i++;
			j--;
		}
	}

	CHugeInt(int num)
	{
		memset(num_, 0, sizeof(num_));   // 初始化
		sprintf(num_, "%d", num);        // 将整形直接转化为字符串整数
		reverse(num_);                   // 字符串逆序,为了和习惯相同
	}

	CHugeInt(char *p)
	{
		memset(num_, 0, sizeof(num_));   // 初始化
		strcpy(num_, p);
		reverse(num_);
	}

	CHugeInt operator+(CHugeInt  const & a)  const       // 两个const不是必要的
	{
		CHugeInt temp(0);                                // 这里不能改变第一个数的值,所有返回temp
		int carry = 0;                                   // 进位
		for (int i = 0; i < 210; i++)
		{
			char c1 = num_[i];
			char c2 = a.num_[i];
			if (c1 == 0 && c2 == 0 && carry == 0)
				break;                                    // 到前面0位的情况
			if (c1 == 0)
				c1 = '0';
			if (c2 == 0)
				c2 = '0';

			int k = c1 - '0' + c2 - '0' + carry;
			if (k >= 10)
			{
				carry = 1;
				temp.num_[i] = k - 10 + '0';
			}
			else
			{
				carry = 0;
				temp.num_[i] = k + '0';
			}

		}
		return temp;
	}


	friend ostream &operator<<(ostream &os, const CHugeInt &a)    // 注意必须有const,否则编译不过
	{
		int len = strlen(a.num_);                                   // 倒序输出
		for (int i = len - 1; i >= 0; i--)
		{
			os << a.num_[i];
		}
		return os;
	}

	friend CHugeInt operator+(int num, CHugeInt & a)
	{
		return CHugeInt(num) + a;
	}

	friend CHugeInt operator+(CHugeInt &a, int num)
	{
		return a + CHugeInt(num);
	}

	CHugeInt & operator+=(int num)
	{
		*this = *this + num;       // 自拷贝,没问题
		return *this;
	}

	CHugeInt & operator++()        // 相当于++b
	{
		*this = *this + 1;
		return *this;
	}

	CHugeInt  operator++(int)
	{
		CHugeInt temp(*this);        // 浅拷贝
		*this = *this + 1;
		return temp;                 // 为什么这里temp的值没变?
	}


	
};
int  main()
{
	char s[210];
	int n;

	while (cin >> s >> n) {
		CHugeInt a(s);
		CHugeInt b(n);
		//cout << a << endl;
		//cout << b << endl;
		cout << a + b << endl;
		cout << n + a << endl;
		cout << a + n << endl;
		b += n;
		cout << ++b << endl;
		cout << b++ << endl;            // 注意b++与++b的区别
		cout << b << endl;
	}
	return 0;
}

 

你可能感兴趣的:(算法)