| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Compile Error??? 不知道在搞什么!#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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator