有问题评论哦,注释应该很清楚啦
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int t, outcome[2600] = {1,1}, sum;//t为输入组数,outcome用于存储阶乘结果
struct condition
{
int n;// n为阶乘数
int a;//a为数码
}con[11];
int main()
{
freopen("title.in", "r", stdin);
cin >> t;
for (int i = 1; i <=t; i++)
{
cin >> con[i].n >> con[i].a;
}
for (int g = 1; g <=t; g++)//遍历条件
{
memset(outcome, 0, 4 * 2600);//数组置零
outcome[1] = 1;//首位为1,要是为零,则会永为零
sum = 0;//全局变量需要置零
int temp = 1;//记录位数
for (int i = 1; i <= con[g].n; i++)//求阶乘
{
for (int s =1; s<=temp; s++)
{
outcome[s] *= i;//逐位相乘,高精度*单精度,再进行每一个位置的进位
}
for (int d = 1; d <=temp; d++)//进位
{
if (outcome[d] > 9)//大于9则进位
{
outcome[d + 1] += outcome[d] / 10;
outcome[d] = outcome[d] % 10;
if (d == temp)
temp++;//当进位到达当前最后一位,则位数需增加一位
}
}
}
for (int i = temp; i > 0; i--)//遍历阶乘结果
{
if (outcome[i] == con[g].a)//判断包含数码的个数
sum++;
}
cout << sum << endl;
}
return 0;
}