uva10106--BigNumber

本文详细介绍了一种自定义的大数类实现,包括加法、乘法等基本运算的重载,并通过具体示例展示了如何使用该大数类进行连续读入数字并计算累积乘积的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己感觉真没什么问题,但是为什么就是提交不过呢。。

晕,原来不是以0结束,纠结了我好久。。

今天下午确实比较烦了。。

//#define LOCAL
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>

using namespace std;

#define MAXN 80 + 10
#define MAX 255 + 10

const int maxn = 10000;

// 大数类的定义 
struct bign
{
	int len, s[maxn];
	bign()
	{
		memset(s, 0, sizeof(s));
		len = 1;
	}
	
	// 重载操作符‘=’用于赋值字符数组
	bign operator = (const char* num)
	{
		len = strlen(num);
		for(int i = 0; i < len; i++)
		{
			s[i] = num[len - i - 1] - '0';
		}
		return *this;
	}
		
	// 重载操作符‘=’用于赋值数字 
	bign operator = (int num)
	{
		char s[maxn];
		sprintf(s, "%d", num);
		*this = s;
		return *this;
	}
	
	// 参数为数字类型的构造函数
	bign(int num)
	{
		*this = num;
	} 
	
	// 参数为字符数组类型的构造函数
	bign(const char* num)
	{
		*this = num;
	} 
	
	// 将字符数组转化成字符串
	string str() const
	{
		string res = "";
		int i;
		for(i = 0; i < len; i++)
		{
			res = (char)(s[i] + '0') + res;
		}
		if(s[i - 1] == 0)
			res = "";
		if(res == "") 
			res = "0";
		return res;
	} 
	
	// 重载操作符 +
	bign operator + (const bign& b) const
	{
		bign c;
		c.len = 0;
		for(int i = 0, g = 0; g || i < max(len, b.len); i++)
		{
			int x = g;
			if(i < len)
				x += s[i];
			if(i < b.len)
				x += b.s[i];
			c.s[c.len++] = x % 10;
			g = x / 10;
		}
		return c;
	}
	
	// 重载操作符 += 
	bign operator += (const bign& b)
	{
		*this = *this + b;
		return *this;
	} 
	
	// 重载操作符 -
	// 重载操作符 -=
	// 重载操作符 *
	bign operator * (const bign& b) const
	{
		bign c;
		c.len = 0;
		int i, j;
		int g; 
		int temp;
		for(i = 0; i < len; i++)
		{
			c.len = i;
			for(j = 0; j < b.len; j++)
			{
				c.s[c.len] += s[i]  * b.s[j] ; // 按位乘 
				g = 0;
				c.len++;
				temp = c.len - 1;
				while(c.s[temp] >= 10) 
				{
					g = c.s[temp] / 10; // 保存进位 
					c.s[temp] = c.s[temp] % 10; // 保存余数 
					temp++;	// 将标志向后推移 
					c.s[temp] += g; // 将余数保存在下一位 
				}
				
			}
		}
		c.len = temp + 1;	
		return c;
	}
	
	// 重载操作符 *=
	bign operator *= (const bign& b)
	{
		*this = *this * b;
		return *this;
	} 
	// 重载操作符 /
	// 重载操作符 /= 
	
	// 重载比较操作符 <
	bool operator < (const bign& b) const
	{
		if(len != b.len) return len < b.len;
		for(int i = len - 1; i >= 0; i++)
			if(s[i] != b.s[i])
				return s[i] < b.s[i];
		return false;
	} 
	
	// 重载比较操作符 >
	bool operator > (const bign& b) const
	{
		return b < *this;
	}
	
	// 重载比较操作符 <=
	bool operator <= (const bign& b) const
	{
		return !(b < *this);
	}
	
	// 重载比较操作符 >=
	bool operator >= (const bign& b) const
	{
		return !(*this < b);
	}
	
	// 重载比较操作符 !=
	bool operator != (const bign& b) const
	{
		return b < *this || *this < b;
	}
	
	// 重载比较操作符 ==
	bool operator == (const bign& b) const
	{
		return !(b < *this) && !(*this < b);
	}
};

	// 重载操作符 >>
istream& operator >> (istream &in, bign& x)
{
	string s;
	in >> s;
	x = s.c_str();
	return in; 
} 
	
// 重载操作符 <<
ostream& operator << (ostream &out, const bign& x)
{
	out << x.str();
	return out;
} 

int main()
{
#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif
	bign num = 0;
	bign result = 1;
	bign temp = 0;
	bool flag = false;
	while(cin >> num && num.s[num.len- 1] != 0)
	{
			result *= num;
			if(flag)
			{
				flag = false;
				cout << result << endl;
				result = 1;
			}
			else 
				flag = true;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值