计算阶乘


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

测试代码:

     int  d;
    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 ,


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值