求解n的阶乘问题

刚刚用向量容器编了这个程序,1000以内的数还好,算到1000的阶乘时,速度就很慢了。若有达人刚好路过,请帮我看下,给些优化的算法,不胜感激。

代码如下:
#include  < iostream >
#include 
< vector >
#include 
< algorithm >
#include 
< iterator >
#include 
< stdio.h >
using   namespace  std;
vector
< int >  compute(vector < int >   & vect,  int  data);
void  showValue(vector < int >   & vect,  int  n);
void  main()
{
    vector 
<   int   >  vect;
    
int  n, i;
    vect.push_back(
1 );
    cout 
<<   " 请输入n的值 "   <<  endl;
    cin 
>>  n;
    
for (i  =   1 ; i  <=  n; i ++  )
    {
    vect 
=  compute(vect, i);
    }
    showValue(vect, n);
}

vector
< int >  compute(vector  < int >   & vect,  int  data)
{
    
int   mulCarry  =   0 , addCarry  =   0 ,   // mulCarry记录加法进位,addCarry记录乘法进位 
                    temp, k, flag  =   0 ;  
    vector 
< int >  sum,mul;     // sum 记录加法的结果,mul记录乘法的结果
    vector  < int >  ::iterator vectIter,sumIter,mulIter;
    
while (data)
    {
        mul.clear();
        addCarry 
=   0 ;             // 加法进位
        mulCarry  =   0 ;             // 乘法进位
        k  =  data  %   10 ;           // 从个位依次开始计算
        data  =  data  /   10
        
if (flag ++   >   0 )       
        {
            vect.insert(vect.begin(),
1 0 );      // 每次补一个0
        }    
        
if ( ! k)         //  若k为0,则无需计算           
        {
            
continue ;    
        }
        
for (vectIter  =  vect.begin(); vectIter  !=  vect.end(); vectIter ++ )
        {
            temp 
=   * vectIter  *  k  +  mulCarry;              
            mulCarry 
=  temp  /   10 ;
            mul.push_back(temp 
%   10 );
        }
        
if (mulCarry  >   0 )
        {
            mul.push_back(mulCarry);    
        }    
        
if (sum.size()  <  mul.size())
        {
            sum.insert(sum.end(), mul.size() 
-  sum.size(),  0 );  
        }
        
for (mulIter  =  mul.begin(),sumIter  =  sum.begin();
            sumIter 
!=  sum.end(); mulIter ++ , sumIter ++ )            
        {    
            temp 
=   * mulIter  +   * sumIter +  addCarry;
            addCarry 
=  temp  /   10 ;
            
* sumIter  =  temp  %   10 ;    
        }
        
if (addCarry  >   0 )
        { 
            sum.push_back(addCarry);
        }
    }    
    
return  sum;
}

void  showValue(vector < int >   & vect,  int  n)            // 打印得到的值,反向打印
{
    cout 
<<  n  <<   " 的阶乘为: " << endl;
    ostream_iterator
< int >  screen(cout);
    copy(vect.rbegin(),vect.rend(),screen);
    cout 
<<  endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值