Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Compile Error??? 不知道在搞什么!

Posted by new_star at 2008-12-23 20:58:13
#include<iostream>
#include<cstring>
using namespace std;
#define MAXSIZE 1000

class BigNum{
public:

	BigNum( void );
	BigNum( char num[] );
	
	BigNum operator +( BigNum & );	//加法运算
	BigNum operator *( BigNum & );	//乘法运算
	void reverse( void );			//翻转字符串
	void remove_prezero( void );    //去除前导零
	bool operator == ( BigNum & );
	friend ostream & operator <<( ostream &out, BigNum &num )
	{
		num.remove_prezero(), num.reverse();
		cout << num.digits;
		return out;
	}

private:
	char digits[MAXSIZE];  //digits左边为低位
	int len;
};

//未显示初始化,将自动初始为零
BigNum::BigNum( void )
{
	digits[0] = '0';
	digits[len = 1] = '\0';
}

//num左边为高位
BigNum::BigNum( char num[] )
{
	len = strlen( num );
	for ( int i = 0, j = len-1; i < len; i++, j-- ){
		digits[i] = num[j];
	}
	digits[len] = '\0';
	remove_prezero();
}

//大整数加法
BigNum BigNum::operator +( BigNum& num )
{
	BigNum result;
	int carry = 0, i = 0, digit;
	while ( i < len || i < num.len ){
		digit = 0;
		if ( i < len ) digit += digits[i]-'0';
		if ( i < num.len ) digit += num.digits[i]-'0';
		result.digits[i++] = '0'+(digit+carry)%10;
		carry = (digit+carry)/10;
	}
	if ( carry ) result.digits[i++] = '0'+carry;
	result.digits[result.len = i] = '\0';
	result.remove_prezero();
	return result;
}

//大整数乘法,要求结果不能溢出
BigNum BigNum::operator *( BigNum &num )
{
	BigNum result;
	static int tmp[MAXSIZE];
	int i, j, carry;
	memset( tmp, 0, sizeof(tmp) );
	for ( i = 0; i < len; i++ ){
		for ( j = 0; j < num.len; j++ ){
			tmp[i+j] += (digits[i]-'0')*(num.digits[j]-'0');
		}
	}
	carry = 0;
	for ( i = 0; i < MAXSIZE; i++ ){
		result.digits[i] = '0'+(tmp[i]+carry)%10;
		carry = (tmp[i]+carry)/10;
	}
	for ( i = MAXSIZE-1; i >= 0; i-- ){
		if ( result.digits[i] != '0') break;
	}
	result.digits[result.len = i+1] = '\0';
	result.remove_prezero();
	return result;
}

//翻转大整数
void BigNum::reverse( void )
{
	int i = 0, j = len-1;
	while ( i < j )	swap( digits[i++], digits[j--] );
}

//去除前导零
void BigNum::remove_prezero( void )
{
	while ( len > 1 ){
		if ( digits[len-1] != '0' ) break;
		digits[(len--)-1] = '\0';
	}
}

bool BigNum::operator ==( BigNum &num )
{
	if ( len != num.len ) return false;
	for ( int i = 0; i < len; i++ )
		if ( digits[i] != num.digits[i] ) return false;
	return true;
}

BigNum ways[255], zero("0"), one("1"), two("2"), three("3");

BigNum f( int n )
{
	BigNum tmp;
	if ( !(ways[n] == zero) ) return ways[n];
	if ( n == 1 ) return one;
	if ( n == 2 ) return three;
	tmp = f(n-2);
	ways[n] = f( n-1 )+two*tmp;
	return ways[n];
}

int main( void )
{
	int n;
	while ( cin >> n ) {
		cout << f(n) << endl;
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator