小明的数学题2

大数阶乘题

小明的数学题Ⅱ

Acceteped : 703 Submit : 1377
Time Limit : 1000 MS Memory Limit : 65536 KB
 

Description

小明是个小学五年级的学生,为了早点去看自己爱看的卡通,他想快点把作业做完。可是可恶的数学老师今天却布置了一道难题,小明想了很久也不知道该怎么做。你的任务就是帮小明解决掉这道数学题。
题目是这样子的,有一个正整数n(1<=n<200),计算它的阶乘n!。


输入:

第一行是一个整数K,表示有多少个测试用例,以后每行一个测试用例,每行有一个整数n。


输出:

每行输出一个测试用例的结果

 

Sample Input

2 
5
20
 

Sample Output

120
2432902008176640000
 

Source

程序设计实践

解题思想:

① 使用一个数组来保存阶乘的每一位结果,一个数组元素保存一位数。 eg:11的阶乘为0 3 9 9 1 6 8 0 0 ,将其保存至数组的8个元素中。

② 若计算12的阶乘,就将每个数组元素中的值乘以12,并保存到数组中。eg:11!*12 = 0 36 108 108 12 72 96 0 0。

③ 接下来判断每个数组元素是否需要进位,通过进位操作,每个数组元素中只有一位数。eg:12!= 0 36 108 108 12 72 96 0 0 = 4 7 9 0 0 1 6 0 0。


int型数据至多计算至12!long型13!double型171!尔后直接溢出,不能用递归。

思想还是比较简单的。


//XTU 1032
//2013.4.16
//注:XTU上GCC编译通过,C++不过。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int main()
{
    int n,num;
    int a[400];
    int carry;
    int digit;
    int temp,i,j;
    scanf("%d",&n);
    while(n--)
    {
		double sum=0;
		scanf("%d",&num);
		for(i=1;i<=num;i++)
			sum+=log10(i);
		digit=(int)sum+1;
		for(i=0;i<=digit;i++)
			a[i]=0;
        a[0]=1;
        for(i=2; i<=num; ++i)
        {
            for(j=1,carry=0; j<=digit; ++j)
            {
                temp=a[j-1]*i+carry;
                a[j-1]=temp%10;
                carry=temp/10;
            }
            while(carry)
            {
                a[++digit-1]=carry%10;
                carry/=10;
            }
        }
        for(i=digit; i>=1; --i)
            printf("%d",a[i-1]);
        printf("\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值