大数相乘

Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! 
Input
One N in one line, process to the end of file. 
Output
For each N, output N! in one line. 
Sample Input
1
2
3
Sample Output
1
2
6 
大数阶乘,这一道题特别难受人。
首先是思路,然后是细节,这里我就介绍一下。
 思路是模拟乘法的方式,进行算法运算。因为10000的阶乘是34000多位,在这里可以开一个40000的数组,再
开两个for循环,第一个是控制每一个数相乘,第二个控制大数每一位数与第一个for循环中的数相乘。
并且每次取余这样就不会爆了。
细节吗??????
自己多注意

    int n,s,i,j,l;               //s是余数。
    int a[40000];
    while(~scanf("%d",&n)) 
    {
        memset(a,0,sizeof(a));
        a[0]=1;
        int d=0;
        for(i=2; i<=n; i++)      //控制每次相乘的那个数。
        {
            s=0;                 //余数刚开始变成0
            for(j=0; j<=d; j++)   //这里代码非常简化,完全不会怕超时。d的个数没次都增加1
            {
                l=a[j]*i+s;
                a[j]=l%10;
                s=l/10;
            }
            while(s)            //这里是观察每次超出了多少位,然后再使用空余的数组空间
            {
                a[++d]=s%10;
                s=s/10;
            }
        }
        for(int j=d; j>=0; j--)   //这里从d开始就不说了,自己理解。
            printf("%d",a[j]);
        printf("\n");
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值