yjm0105 阅读(743) 评论(2)
代码如下(结果保存在字符数组里,仅仅打印出来):

#include 
<string.h>
#include
<iostream.h>
#include
<stdio.h>
#include 
<process.h>

#define N 1000    //结果位数上限(10进制)

char *ret;
//char ret[N];    //存放阶乘结果(也是下一次计算的被乘数)
int ret_size=1;

void fact(char *fac)
{
    
char *buf,*p,*cf,ci=0,ct=0,cu=0;
    
int len,len1,len2,i,j=0;
    len1
=ret_size;
    len2
=strlen(fac);    //乘数位数
    len=len1+len2;
    buf
=new char[len];    //暂存计算结果
    memset(buf,0,len);
    cf
=fac+len2-1;        //指向乘数中当前进行计算的位
    while(cf>=fac)
    
{    p=ret+len1-1;
        i
=ci++;
        
for(int m=0;m<len1;m++)
        
{                
            ct
=(*(p--)) * (*cf-0x30)+cu+buf[i];            
            buf[i
++= ct%10;
            cu
=ct/10;        //进位        
        }

        
if(m==len1 && cu)
        
{
            buf[i
+++= cu;
            cu
=0;
        }

        cf
--;            //进行乘数下个位的乘法        
    }


    ret_size
=i;
    
//复制结果到ret中
    for(int k=0;k<i;k++)
        ret[k]
=buf[i-k-1];

    delete []buf;
}


int main()
{    
    
char ch[20];    //要求的n!中n的10进制位数    
    int t=0,x=1;    //t: 阶乘数
    cout<<"输入要计算的阶乘n!中的数n:";
    
while(!t)
    
{
        
        cin
>>t;        
        
if(t<=0)
            cout
<<"输入错误,重新输入:";
        cin.clear();
        cin.ignore();
    }
    
    
int n=t,z=0;
    
while(n>0)
    
{
        n 
/= 10;
        z
++;
    }
    

    ret
=new char[t*z+20];    

    memset(ret,
0,sizeof(ret));
    ret[
0]=1;
    ret_size
=1;    //保存阶乘结果的位数    

    
while(x<=t)
    
{
        cout
<<x<<"! = ";
        sprintf(ch,
"%d",x++);
        fact(ch);
//计算 x! ,根据 x! = x* (x-1).
        
//打印x!
        for(int i=0;i<ret_size;i++)
            cout
<<(char)(ret[i]+0x30);
        cout
<<endl<<endl;

    }


    delete []ret;

    system(
"pause");
    
    
return 0;
}




评论列表
Bjarne_CPP
re: 求任意数的阶乘N!
流云大哥好。原来你在vckbase上有blog啊。 以后多来参观了。现在把你的文章都仔细看一次-_-.
流云
re: Bjarne_CPP
欢迎指出漏洞;)

发表评论
切换编辑模式