题目描述
求 n!中某个数码出现的次数。
输入格式
第一行为 t(t≤10),表示数据组数。接下来 t 行,每行一个正整数 n(n≤1000) 和数码 a。
输出格式
对于每组数据,输出一个整数,表示 n! 中 a 出现的次数。
输入输出样例
输入:
2
5 2
7 0
输出:
1
2
传送门:阶乘数码 - 洛谷
c++需要考虑精度问题,java提供BigInt类,python可以直接算。
主要注意对读入的处理,input()读入一行字符串,可以用split(' ')做分割,存入列表中。
读入处理代码如下:
L=input().split(' ')
以样列第一行为例,读入后L=['5','2'] (注意是字符串形式)
下面转化为int类型就可以了,本题中阶乘可以直接用factorial函数计算。
代码(python):
from math import *
t=int(input())
for i in range(0,t):
l=input().split(' ')
n=factorial(int(l[0]))
m=int(l[1])
s=0
while n:
if n%10==m:
s+=1
n//=10
print(s)
c++高精度版本:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n,a,cnt=0;
cin>>n>>a;
vector<int>f;
f.push_back(1);
for(int i=2;i<=n;++i){
int c=0;
for(int j=0;j<f.size();++j){
int t=f[j]*i+c;
f[j]=t%10;
c=t/10;
}
while(c){
f.push_back(c%10);
c/=10;
}
}
for(int i=0;i<f.size();++i) if(f[i]==a) ++cnt;
cout<<cnt<<endl;
}
return 0;
}
最后附上math库比较常用函数:
函数 | 说明 |
exp(x) | e^x |
fabs(x) | |x| |
factorial(x) | x! |
log(x,y) | y为底x的对数 |
log(x) | e为底x的对数 |
log10(x) | 10为底x的对数 |
pow(x,y) | x^y |
sqrt(x) | √x |