大数阶乘题
小明的数学题Ⅱ | ||
Acceteped : 703 | Submit : 1377 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB | |
Description | ||
小明是个小学五年级的学生,为了早点去看自己爱看的卡通,他想快点把作业做完。可是可恶的数学老师今天却布置了一道难题,小明想了很久也不知道该怎么做。你的任务就是帮小明解决掉这道数学题。
第一行是一个整数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;
}