大数据阶乘(The factorial of large data)

题目描述 Description
阶乘是计算中的基础运算,虽然规则简单,但是位数太多了,也难免会出错。现在的问题是:给定任意位数(long long类型)的一个数,求它的阶乘,请给出正确结果。为提高速度,保证给定运算的结果均为正整数。
 输入输出格式 Input/output
输入格式:
一行:一个long long类型的数
输出格式:
一个正整数,表示计算的结果(不可以有前导0)
 输入输出样例 Sample input/output
样例测试点#1
输入样例#1:
3
输出样例#1:

6

输入样例#2:
4
输出样例#2:

24

思路:这题的数据量很大,long long类型的,如果直接计算是不可取的,必须用高精度算法。
这里可以分为几个函数来计算:
①乘法函数:专题里面会细细地讲的
倒序输出函数:专题里面会细细地讲的
③阶乘函数:要把增序的数转换成数组,再传入乘法函数进行计算
代码如下:
 1 #include <stdio.h>
 2 #include <string.h>
 3 /*=============================================================*/
 4                                   /乘法函数// 
 5     
 6 void mul(int a[],int b[])//正整数的高精度运算 a*b ---> c
 7 {
 8     int i=0,j=0,x=0,lenc=0;
 9     int c[99999]; 
10     memset(c,0,sizeof(c));//清零 
11     for(i=1;i<=a[0];i++)
12     {
13         x=0;//表示进位
14         for(j=1;j<=b[0];j++)
15         {
16             c[i+j-1]=c[i+j-1]+a[i]*b[j]+x;
17             x=c[i+j-1]/10;
18             c[i+j-1]=c[i+j-1]%10;
19         }
20         c[i+b[0]]=x;//表示进位(向c的更高位进位)
21     }
22     lenc=a[0]+b[0];
23     while(c[lenc]==0&&lenc>1)  lenc--;
24     c[0]=lenc;
25     for(i=0;i<=lenc;i++)//重新存入数组a 
26     {
27         a[i]=c[i];
28     }
29 }
30 /*==============================================================*/
31                                 /倒序输出函数// 
32 void output(int c[])//倒序输出 
33 {
34     int i;
35     for(i=c[0];i>=1;i--)
36     {
37         printf("%d",c[i]);
38     } 
39     printf("\n");    
40 }
41 /*==============================================================*/
42                                    /计算阶乘函数///
43 void kee(long long n)     
44 {    
45     int h,p=0,r=0,q=0;//一堆for用的东西 
46     int i,k=0;//k记录b数组的有多少号元素 
47     int b[99999]={0};//依次增加乘数 
48     int a[99999]={1,1};//当前被乘数 
49     for(i=1;i<=n;i++)
50     {
51         h=1;
52         p=i; 
53         while(p>0)//把阶乘数i转换成数组
54         {
55             b[h]=p%10;
56             p=p/10;
57             k++;
58         }
59         b[0]=k;
60         mul(a,b);//传入乘法函数 
61     }
62     output(a);//输出结果 
63 }
64 /*==============================================================*/
65                                         /主函数///
66 int main()
67 {    
68     long long n; 
69     scanf("%I64d",&n);
70     if(n==1||n==2)//如果是1、2的话,输出即可 
71     {
72         printf("%I64d\n",n);
73     }
74     else if(n<0)
75     {
76         printf("Wrong Answer!\n");
77     }
78     else kee(n);//传入阶乘函数 
79     return 0;
80 }

 

转载于:https://www.cnblogs.com/geek-007/p/4355994.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值