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 |
请求高人测试程序,还有什么情况我没有考虑到吗?因为最近有一道相似的题目是用运算符重载来做的 所以将原来处理整数的函数加了一点修改用在了这道题上面 //*********************************** 1001 cpp ********************************** # include < string.h> # include < iostream.h> # include < math.h> int pp;// 全局变量用来传递输出的数据应该有几位小数 const int con= 125; class HugeInt { friend ostream &operator<<( ostream &, HugeInt & ); public : HugeInt( long = 0 ); HugeInt( const char * ); HugeInt operator+( HugeInt & ); HugeInt operator+( int ); HugeInt operator+( const char* ); HugeInt operator*( int ); HugeInt operator*( const char *op2 ); HugeInt operator*( const HugeInt & op2 ); void getOne( char[] );// 从外界取得要处理的数据 private: int integer[con]; // it means the position of the pointer; }; HugeInt::HugeInt( long val ) { int i; for ( i=0; i<=con-1; i++ ) integer[i] =0; for ( i=con-1; val!=0 && i>=0; i-- ) { integer[i]= val % 10; val =val/ 10; } }// HugeInt::HugeInt ( const char *string ) { int i, j; for ( i=0; i<=con-1; i++ ) integer[i]=0; for ( i= con- strlen( string ), j=0; i<=con-1; i++, j++ ) { integer[i] = string[j] -'0'; } }// 将数据储存到数组integer[]中去,转化为 // 重载运算符*可计算的类型 HugeInt HugeInt::operator+( HugeInt & op2 ) { HugeInt temp; int carry = 0; for ( int i=con-1; i>=0; i-- ) { temp.integer[i] = integer[i] + op2.integer[i] + carry; if ( temp.integer[i] > 9 ) { temp.integer[i] = temp.integer[i]%10; carry = 1; } else carry = 0; } return temp; } HugeInt HugeInt::operator+( int op2 ) { return *this + HugeInt( op2 ); } HugeInt HugeInt::operator+( const char *op2 ) { return *this + HugeInt ( op2 ); } ostream& operator<< ( ostream &output , HugeInt &num )// 此函数还需要进一步修改,如处理末尾的0的问题 { int i; for ( i=0; ( num.integer[i] == 0 ) && ( i<=con-1 ); i++ ) { if( i== con-pp ) break; } if( i == con ) output << 0; else for ( ; i<=con-1; i++ ) { int NumOfZero=0; for ( int j=i; j<=con-1; j++ )//处理数据末尾的0 { if( num.integer[j]== 0 ) NumOfZero++; } if( NumOfZero== con-i )//如果后面全是0,就跳出循环 break; if( i== con-pp )//在适当的位置添加小数点 output<<"."; output << num.integer[i]; } return output; } HugeInt HugeInt::operator*( const HugeInt & op2 )// 先从最简单的情况开始考虑 { HugeInt op4;// 储存最终的计算结果 int c=0;// 退位置的计数 for ( int i = con-1; i>=0 ; i-- ) { int t=0;// save the higer_position number HugeInt op3;// 储存中间的计算结果 for ( int j=con-1; j>=0; j-- ) { int m= integer[j]* op2.integer[i]+t ; op3.integer[j-c]= m % 10; t= m/10; } c++; op4= op4 + op3; } return op4; } HugeInt HugeInt::operator*( const char *op2 )// no declaration in the class { return (*this) * HugeInt ( op2 ); } HugeInt HugeInt::operator*( int op2 ) { return (*this) * HugeInt( op2 ); } void HugeInt::getOne( char ch2[] ) { for ( int j=4,i=con-1; j>=0 ; j--, i-- ) { this->integer[i]=ch2[j]-'0'; } } void main() { HugeInt a1("0144") ,a2("0"),a3("1234567891"),a4("15"), a5,a6 ; char ch1[7], ch2[7]; int n,m;// 其中n纪录循环的次数 cin>>ch1>>n; int i; for( i=0; i<7; i++ ) { if( ch1[i]=='.' ) break; } m=6-i-1;// m纪录小数点后面有几位数字 int cach=0; for ( int j=0; j<7; j++ ) { if( ch1[j]!='.' ) ch2[ cach++ ]= ch1[j]; } a5.getOne( ch2 ); pp= m*n; a6=a5; for ( i=1; i<=n-1; i++ ) { a6=a6*a5; } cout<<a6; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator