uva10106--BigNumber

3670 ワード

自分では本当に大丈夫だと思いますが、なぜ提出できないのでしょうか.
めまいがして、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;
}