题目详见
http://acm.hdu.edu.cn/showproblem.php?pid=1042
对于大数(比如1000的阶乘)我们找不到一个数据类型存放这个数
1.用数组模拟大数的运算。
2.开一个比较大的整型数组,数组的元素代表数组的某一位。
3.通过对数组元素的运算模拟大数的运算。
4.将数组输出(最后去掉前导0,即如果结果是342,那么就不能输出为0342)
code1:数的低位存在数组中的低位,输出时倒过来从数组高位到低位输出
//#include<cstdio>
#include<iostream>//C++中标准输入输出流,没有iostream输出有错
#include<cstring>
using namespace std;
const int maxn=36000;//10!约有35660位
//数组稍微开大点 以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。
int a[maxn];
int main()
{
int n,i,j,c,s;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));//数组的初始化 memset(a/*数组名*/,0/*要赋予的值*/ ,sizeof(a)/*数组元素个数*/)
a[0]=1;
for(i=1;i<=n;i++)
{
c=0;
for(j=0;j<maxn;j++)//数的低位存在数组中的低位
{
s=a[j]*i+c;//逐位相乘得到的值(可能>=10)
a[j]=s%10;//考虑进位 第J位上的数 (数组中每个位置的值只能是一位数)
c=s/10;// 向高位进位的值
}
}
for(j=maxn-1;j>=0;j--)//从高位向低位扫描 找到第一个不是零的数 (该for语句的循环体为空语句)
if(a[j]) //for循环里的j一直自减直到a[j]!=0跳出for循环
break;
for(i=j;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}
return 0;
}
个人比较喜欢code2
code2:数的低位存在数组中的高位,输出时直接从低位开始输出
//#include<cstdio>
#include<iostream>//C++中标准输入输出流,没有iostream输出有错
#include<cstring>
using namespace std;
const int maxn=36000;//10!约有35660位
//数组稍微开大点 以免不小心没有算准这个“正好合适”的数值,而导致数组小了,产生越界错误。
int a[maxn];
int main()
{
int n,i,j,c,s;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));//数组的初始化
for(i=1,a[maxn-1]=1;i<=n;i++)
{
c=0;
for(j=maxn-1;j>=0;j--)//数的低位存在数组中的高位
{
s=a[j]*i+c;
a[j]=s%10;
c=s/10;
}
}
for(j=0;j<maxn;j++)
if(a[j])
break;
for(i=j;i<maxn;i++)
printf("%d",a[i]);
printf("\n");
}
return 0;
}