【题目】
输入不超过1000的正整数n,输出n!=123*…*n的精确结果
【样例输入】
30
【样例输出】
265252859812191058636308480000000
【分析】
为了保存结果,需要先分析1000!有多大。计算得1000!约等于4**10的2567次方,因此可以用一个3000个元素的数组f保存。
为了方便起见,我们让 f[0]保存结果的个位,f[1]是十位,f[2]是百位…(为什么要逆序表示呢?因为如果按照从高到低的顺序储存,一旦进位的话就。。),则每次只需要模拟手算即可完成n!。在输出时需要忽略前导0.注意,如果本身就是0,那么忽略所有前导0后将什么都不输出。
void fun(){
int i,j;
memset(a_int,0,sizeof(a_int));
a_int[0]=1;
int n;
int total,res;
scanf("%d",&n);
for(i=1;i<=n;i++)
{res=0;total=0;
for(j=0;j<M;j++)
{
total=a_int[j]*i+res;
a_int[j]=total%10;
res=total/10;
}
}
for(j=M-1;j>=0;j--)
if(a_int[j])
break;//舍去无用的0
for(i=j;i>=0;i--)
printf("%d",a_int[i]);
printf("\n");
}//阶乘的高精度运算
下面为普通求阶乘的方法:
int fun(int n){
int i;
int s=1;
for(i=1;i<=n;i++)
s*=i;
return s;
}
【解释】
让 f[0]保存结果的个位,f[1]是十位,f[2]是百位…
到底是什么意思???
当n=1时,最终结果1,f[0]=1,其他位0即可;
当n=2时,最终结果2,f[0]=2,其他位0即可;
当n=3时,最终结果6,f[0]=6,其他位0即可;
.当n=4时,最终结果24,f[0]=24,f[0]=4,f[1]=2,其他位0即可;
等等。
【寄语】
生命里最重要的事情是要有个远大的目标,并借助才能与坚毅来完成它。当然,这个目标是人是物都可,随心就好*…*
欢迎私信,欢迎关注,欢迎留言!!!