阶乘是一个相当简单的数学定义:
!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,
589

被折叠的 条评论
为什么被折叠?



