计算阶乘

大数阶乘计算挑战

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


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值