NYOJ 28 大数阶乘

大数阶乘

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
输入
输入一个整数m(0<m<=5000)
输出
输出m的阶乘,并在输出结束之后输入一个换行符
样例输入
50
样例输出
30414093201713378043612608166064768844377641568960512000000000000

#include<stdio.h>

#include <string.h>
#define MAX 20000//20000 的由来在下面 
int main()
{
int T,s[MAX],n,i,j; 
int sum,t;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(s,0,sizeof(s));
s[0]=1;
for(i=2;i<=n;i++)
{
t=0;
for(j=0;j<MAX;j++)
{
sum=s[j]*i+t;//计算的和 
s[j]=sum%10;//每次取余数放在最低位 
t=sum/10; //保存进位的数 
}
}
   for(i=MAX-1;i>=0;i--)
 
     if(s[i])break;//进行清零操作 

for(j=i;j>=0;j--)

printf("%d",s[j]); //记录最后一个不为0的下标后倒序输出结果 
   }  
printf("\n");
}
return 0;

大数阶乘的结果太大了,一个几千万的数要去求阶乘就要乘以几千次并且数据非常大为了解决这样的问题我们就使用数组来解决,一个数放一个单元最后倒序输出就可以了。

在开辟数组大小的时候我们必须要知道最后的结果是多少位数把,以防止数据太大溢出

那么位数怎么求得的呢?

eg:123是个三位数把,求位数的方法就是(int)(log10(123)+1);

所以下面有一个这样的简单程序去求得位数:

 #include <stdio.h>
    #include<math.h>    
    int main()  
    {  
        int N,n;  
        double sum;  
        int i;  
        scanf("%d",&N);  
        while(N--)  
        {  
            sum=0;  
            scanf("%d",&n); 
            for(i=1;i<=n;i++)  
            {  
                sum+=log10((double)i);  
            }  
            printf("%d\n",(int)sum+1); 
        }  
        return 0;  
    } 


加油啊~


还有一个代码是朋友写的

#include<stdio.h>
int main()
{
int m,a[20000],i,j,x,b,c;
scanf("%d",&m);
a[0]=1;//第一位一定要放1!!!
x=2;                                    
b=1;                                   //表示当前有多少位数
c=0;                                   //进位
while(x<=m)
{
for(i=0;i<b;i++)
{
a[i]=a[i]*x+c;
c=a[i]/10;
a[i]=a[i]%10;
}
while(c>0)
{
a[i]=c%10;
i++;
c=c/10;
}
b=i;
x++;
}
for(i=b-1;i>=0;i--)
printf("%d",a[i]);
printf("\n");
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值