uva10106--BigNumber

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

晕,原来不是以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;
}


你可能感兴趣的:(c,struct,String)