fuguizait @ 2022-11-23 20:38:01
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int A[5001];
//int len = 1; //阶乘n的位数
//1.高精度*低精度
void mul(int &len, int k)
{
int g = 0, i; //进位
for (i = 0; i < len; i++)
{
A[i] = A[i] *k + g;
g = A[i] / 10; //进位
A[i] = A[i] % 10; //保留个位数
//if (A[len])
// len++;
}
//处理最高位溢出:
while(g > 0) //还有进位,进位不为0
{
A[i] = g / 10;
g %= 10;
i++;
}
len = i - 1;
}
//打印函数:
void printInt(int &len, int x)
{
int num = 0;
for (int i = len - 1; i >= 0; i--)
{
if (A[i] == x)
num++;
}
cout << num << endl;
}
int main(void)
{
int t;
cin >> t;//t行数据
while(t--) //查询次数
{
int len = 1;
//数组初始化为0:
for (int i = 0; i <= 5000; i++)
A[i] = 0;
A[0] = 1; //1! = 0;
int n = 0, a = 0;
cin >> n >> a;//n的阶乘 求a出现的次数
for (int i = 2; i <= n; i++)
mul(len, i);
printInt(len, a);
}
return 0;
}
by super_LD @ 2022-11-28 15:27:32
你这个数组第二次没有清零。还是会有数据的。
by xingcode @ 2022-12-06 18:29:09
#include<bits/stdc++.h>//万能头
using namespace std;
int a[2600],t,n,q,s;//存放数组
int main()
{
cin>>t;//输入数据组数
for(int k=1;k<=t;k++)
{
s=0;//归0
cin>>n>>q;
memset(a,0,sizeof(a));//别忘了清零!!!
a[0]=1;//1!=1
for(int i=1;i<=n;i++)
{
int x=0;//进位数
for(int j=0;j<=2599;j++)
{
a[j]=a[j]*i+x;//高精
x=a[j]/10;//进位
a[j]%=10;
}
}
bool f=0;//做标记
for(int j=2599;j>=0;j--)//去除前缀0
{
if(a[j]!=0)//非0,开始
{
f=1;//标记为真
}
if(f)
//f为真,开始判断
{
if(a[j]==q)//相同
{
s++;
}
}
}
cout<<s<<endl;//输出
}
return 0;//好习惯
}