洛谷P1591--阶乘数码_题解

来源:互联网 发布:java工作两年工资 编辑:程序博客网 时间:2024/06/09 23:51

/*

P1591 题解

多次高精度乘低精度+循环枚举

*/

#include <cstdio>//头文件#include <cstring>//头文件int s[10001]={0},t=0,n=0//定义变量,s数组是用来存储答案的,因为答案可能会很大,所以要用高精,t表示这个数(即答案)有t位,n表示接下来要进行一次n的阶乘,即(n!)int Cheng(int n)//用来进行乘法的函数(即Cheng){    for(int i=1;i<=t;i++)//首先,先从1到n进行循环,让s数组的每一位都乘上一个n    {        s[i]*=n;//将s数组的第i位乘以n    }    for(int i=1;i<=t;i++)//从1到t进行循环(即循环s数组的每一位)    {        if(s[i]>9)//如果s数组的第i为需要进行进位操作        {            s[i+1]+=s[i]/10;//根据满十进一的原则,那么,我们可以得到(s[i+1]+=s[i]/10)            s[i]%=10;//进完位之后剩下的(也可以写成s[i]=s[i]-(s[i]/10)*10)            if(i+1>t)//如果当前所在的第i位是最高位            {                t++;//那么就将t加1            }        }    }    return 0;//返回0(结束这个函数)}int main()//主函数{    int c=0;//c代表的是接下来将会有c组数据    scanf("%d",&c);//读入c(即读入接下来会有多少组数据)    while(c--)//做c次循环(也可以写成for循环)    {        int ans=0,l=0;//初始化变量        memset(s,0,sizeof(s));//将s数组的每一位都刷成0        s[1]=1;//第一位一定要是1,因为0乘以任何数的结果都为0,所以s数组的第一位要是1        t=1;//一开始这个数只有一位(请想一想t为什么不能为0)        scanf("%d %d",&n,&l);//读入n和l(表示要问n!里面有多少个l这个数字)        for(int i=1;i<=n;i++)//开始求n的阶乘(即n!)        {            Cheng(i);//将s数组乘以i这个数字        }        for(int i=t;i>=1;i--)//开始找n!里面有多少个l这个数字        {            if(s[i]==l)//如果找到了一个            {                ans++;//那么就将答案数加1            }        }        printf("%d\n",ans);//输出答案    }    return 0;//结束程序}