C++ 实现大数加法类

这里运算符的重载比较难

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

总时间限制: 

1000ms

 

内存限制: 

65536kB

// 在此处补充你的代码

描述

程序填空,输出指定结果

#include <iostream> 
#include <cstring> 
#include <cstdlib> 
#include <cstdio> 
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 <iostream> 
#include <cstring> 
#include <cstdlib> 
#include <cstdio> 
using namespace std;
const int MAX = 110; 
class CHugeInt {
	// 在此处补充你的代码
private:
	char c[200];

public:
	// 将字符串反转
	void reverse(char *a)
	{
		int i = 0, j = strlen(a) - 1;
		while (i < j)
		{
			swap(a[i], a[j]);
			i++;
			j--;
		}
	}
	CHugeInt(const char* a)
	{
		int len;
		memset(c, 0, 200); // 把c全部置为0
		strcpy(c, a);
		len = strlen(c);
		reverse(c);
	}
	CHugeInt(int n)
	{
		int len;
		memset(c, 0, 200); // 把c全部置为0
		sprintf(c, "%d", n);//把n转换为char存在c
		len = strlen(c);
		reverse(c);
	}
	CHugeInt operator +(const CHugeInt &b)const
	{
		CHugeInt a(0);
		int lenb = strlen(b.c);
		int len = strlen(c);
		int lena;
		if (b.c[0] == '0' && lenb == 1)
		{
			// b为0的情况
			return *this;
		}
		if (c[0] == '0' && len == 1)
		{
			// a为0的情况
			strcpy(a.c, b.c);
			return a;
		}
		int j = 0;
		// 正常大数加法
		for (int i = 0; i < len || i < lenb; i++)
		{
			int x = 0;
			char c1 = c[i], c2 = b.c[i];
			if (c[i] == 0)
				c1 = '0';                 // 注意前面处理中有的字符串位是用数字0填充的
			if (b.c[i] == 0)
				c2 = '0';
			x = c1 - '0' + c2 - '0' + j;  // j是进位
			a.c[i] = (x % 10) + '0';      // 处理进位
			j = x / 10;                   // j是进位
		}
		// 将字符串长度较大值,给新的字符串
		lena = len > lenb ? len : lenb;
		// 如果还有进位
		if (j != 0)
		{
			int a0 = len > lenb ? len : lenb;
			a.c[a0] = j + '0';
			lena = a0 + 1;
		}
		return a;
	}

	CHugeInt operator +(int n)
	{
		return *this + CHugeInt(n);
	}

	friend CHugeInt operator +(int n, const CHugeInt &h) {
		// 这里用上面函数,传的引用
		return h + n;
	}

	CHugeInt& operator +=(int n) {
		*this = *this + CHugeInt(n);//直接调用默认复制构造函数,因为char c[200]是数组不是指针
		return *this;
	}

	friend CHugeInt& operator ++(CHugeInt &a) {
		a = a + 1;
		return a;
	}
	
	friend ostream& operator<<(ostream& o, const CHugeInt& a) 
	{	

		int len = strlen(a.c);
		for (int i = len-1; i >= 0; --i) 
		{			
			cout << a.c[i];		
		}		
		return o;	
	}

	friend CHugeInt operator ++(CHugeInt &a, int) {
		CHugeInt b = a;
		a = (b + 1);
		return b;
	}
};
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;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值