ZZULIOJ【1089】阶乘的最高位:(int类型)
1089: 阶乘的最高位
1089: 阶乘的最高位
时间限制: 1 Sec 内存限制: 128 MB
题目描述
输入一个正整数n。输出n!的最高位上的数字。
输入:输入一个正整数n(n不超过1000)。
输出:输出n!的最高位上的数字。
样例输入:1000
样例输出:4
提示:注意double类型溢出问题。
问题链接.
思路
很明显我无视了最重要的提示,
加上学艺不精想不到1000!这么大的数该怎么表示,
然后就想到了数组,简单来说就是把十进制的每一位都用一个数来表示(感觉相当麻烦)
仅供参考!!!
#include<stdio.h>
int main()
{
int n,a[3000]={1},i,k,t,l=1,m; //数组越大可以算的数也越大(默认为1,因为要算乘法)
scanf("%d",&n);
for(i=1;i<=n;i++) //阶乘循环 i的数值代要乘的那个数,每次+1
{
t=0; //t用来保存数(工具人)
for(k=0;k<l;k++) //数位循环 k的数值代表数位,l用来记录数组中最高位的位置
{
m=a[k]*i; //m为k数位乘积 例;当a[0]=6,i=4,则 m=24
a[k]=(m+t)%10; //将t与m相加,对10取余,得到k数位上的数,例中a[0]为个位,计算后个位数为4
t=(m+t)/10; //将t与m相加,因为是整型除以10可直接得到k+1位的数,例中m=24 时t=2
if(t!=0&&k==l-1) l++; //t!=0时有进位,k==l-1表示为最高位进位 此时l+1
} //若t!=0但k!=l-1则为非最高位进位,即此时为中间位计算,l不用+1
}
printf("%d",a[l-1]); //其实最高位在l-1的位置
}
本人第一次写博客,还请大家多多指正,感谢!