现在的位置: 首页 > 综合 > 正文

HDOJ 1002:A + B Problem II 长整数加法的模板

2018年05月25日 ⁄ 综合 ⁄ 共 1265字 ⁄ 字号 评论关闭

       今天第三次写长整数加法的题目,不是为了水题。而是为了联系一下运算符重载的语法特性。运用运算符重载之后,感觉代码的可读性更好了,运算符重载的表达功能真的很强。哈哈。贴个AC代码,和大家分享.

       这道题目的url:http://acm.hdu.edu.cn/showproblem.php?pid=1002。

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

const int Max = 1010;
char str[Max];

class BigNum
{
public:
	int data[Max];
	int len;

	BigNum()
	{
		memset(data, 0, sizeof(data));
	}

	BigNum operator =(char * str)
	{
		memset(this->data, 0, sizeof(this->data));
		len = strlen(str);
		for(int i=len-1; i>=0; i--)
			data[len-i-1] = str[i] - '0';
		return *this;
	}

	BigNum operator =(int num)
	{
		memset(this->data, 0, sizeof(this->data));
		int index = 0;
		while(num)
		{
			data[index] = num % 10;
			num /= 10;
			index ++;
		}
		if(index == 0) index = 1;
		return *this;
	}

	friend BigNum operator +(BigNum &a, BigNum &b)
	{
		BigNum r;
		r = 0;
		int index = 0, carry = 0;
		int len = max(a.len, b.len);
		for(; index<len; index++)
		{
			r.data[index] = (a.data[index] + b.data[index] + carry) % 10;
			carry = (a.data[index] + b.data[index] + carry) / 10;
		}
		if(carry)
		{
			r.data[index] = carry;
			index ++;
		}
		if(index == 0) index = 1;
		r.len = index;
		return r;
	}

	friend ostream & operator << (ostream & stream, BigNum &num)
	{
		for(int i=num.len-1; i>=0; i--) 
			stream << num.data[i];

		return stream;
	}
};

int main()
{
	int cases;
	BigNum a, b, r;
	cin >> cases;
	for(int i=1; i<=cases; i++)
	{
		cin >> str;
		a = str;
		cin >> str;
		b = str;
		r = a + b;
		cout << "Case " << i << ":" << endl;
		cout << a << " + "  << b << " = " << r << endl;
		if(i != cases)	cout << endl;
	}
	system("pause");
	return 0;
}

抱歉!评论已关闭.