阶乘是一个相当简单的数学定义:
!5 = 5 * 4 * 3 * 2 * 1
但是编程起来就出现了一个难题,就是结果数值超大,整数根本无法保存.
99 的阶乘的结果大约是155位整数.
因此必须设计自己的数据结构,用来保存数据,第二个是设计自己的乘法,用于该数据结构.
在编码的时候,并没有花费太多的时间就弄到了正确的结果,但是有一个问题,就是如何用10进制整数表示出来,这个倒难倒了我.
希望高手指点一下.
下面是我的实现,没有实现有符号的情况:
struct
bignum
{
private :
std::deque < unsigned int > left;
public :
typedef std::deque < unsigned int > con;
bignum & operator *= ( unsigned int right )
{
size_t i = left.size();
unsigned int up = 0 ;
unsigned int temp = 0 ;
if ( i == 0 )
{
left.push_back( right );
return * this ;
}
while ( i )
{
up >>= 16 ;
temp = left.front() * right + up;
up = temp;
left.push_back( up & 0xffff );
left.pop_front();
-- i;
}
if ( up >>= 16 )
{
left.push_back( up );
}
return * this ;
}
friend ostream & operator << ( ostream & o, bignum const & big )
{
// 16进制
for ( bignum::con::const_reverse_iterator pos = big.left.rbegin();
pos != big.left.rend();
++ pos )
{
o << std::hex << std::setw( 4 ) << std::setfill( ' 0 ' ) << * pos << " , " ;
}
// int b = 0; // 十进制最高位
// for ( bignum::con::const_reverse_iterator pos = big.left.rbegin();
// pos != big.left.rend();
// ++pos )
// {
// // 10进制
// int temp = ( *pos << 16 ) ; // + b
// deque<char> dq;
// do
// {
// dq.push_back( temp % 10 + '0' );
// b = temp;
// } while ( temp /= 10 );
//
// copy( dq.rbegin(), dq.rend(), ostream_iterator<char>( o ) );
// }
return o;
}
};
{
private :
std::deque < unsigned int > left;
public :
typedef std::deque < unsigned int > con;
bignum & operator *= ( unsigned int right )
{
size_t i = left.size();
unsigned int up = 0 ;
unsigned int temp = 0 ;
if ( i == 0 )
{
left.push_back( right );
return * this ;
}
while ( i )
{
up >>= 16 ;
temp = left.front() * right + up;
up = temp;
left.push_back( up & 0xffff );
left.pop_front();
-- i;
}
if ( up >>= 16 )
{
left.push_back( up );
}
return * this ;
}
friend ostream & operator << ( ostream & o, bignum const & big )
{
// 16进制
for ( bignum::con::const_reverse_iterator pos = big.left.rbegin();
pos != big.left.rend();
++ pos )
{
o << std::hex << std::setw( 4 ) << std::setfill( ' 0 ' ) << * pos << " , " ;
}
// int b = 0; // 十进制最高位
// for ( bignum::con::const_reverse_iterator pos = big.left.rbegin();
// pos != big.left.rend();
// ++pos )
// {
// // 10进制
// int temp = ( *pos << 16 ) ; // + b
// deque<char> dq;
// do
// {
// dq.push_back( temp % 10 + '0' );
// b = temp;
// } while ( temp /= 10 );
//
// copy( dq.rbegin(), dq.rend(), ostream_iterator<char>( o ) );
// }
return o;
}
};
测试代码:
int
d;
cin >> d;
bignum big;
for ( int i = d; i > 1 ; -- i)
{
big *= i;
}
cout << big << endl;
cin >> d;
bignum big;
for ( int i = d; i > 1 ; -- i)
{
big *= i;
}
cout << big << endl;
测试结果, 99的阶乘:
0045 ,9b1a,633c,60eb,e158, 8816 ,9cea,db3d, 9226 ,2c8c,a2d3,0c97, 6089 ,773e,059f,023b,
0acf,97bb,c020,beeb,d907,7cad,5a11, 7825 ,3ae8,bdd5,048a, 8000 , 0000 , 0000 , 0000 , 0000 ,
0000 ,