zhouyuxuan2023 @ 2024-05-31 21:01:28
代码如下
#include<bits/stdc++.h>
using namespace std;
void jiecheng(int n,int x){
int a[100005]={0},len=1,cnt=0;
a[1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=len;j++){
a[j]*=i;
}
for(int j=1;j<=len;j++){
a[j+1]+=a[j]/10,a[j]%=10;
}
if(a[len+1]){
len++;
}
}
for(int i=1;i<=len;i++){
if(a[i]==x){
cnt++;
}
}
cout<<cnt<<'\n';
return ;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t,n,a;
cin>>t;
while(t--){
cin>>n>>a;
jiecheng(n,a);
}
return 0;
}
by 210101zhaosicheng @ 2024-05-31 21:21:28
你可以尝试一下这样修改:
1、将数组开到外面。
2、将第二重循环从1~10000。
3、将len++改成从10000~0寻找第一位非零的数字。
因为乘数不一定只有1位,可能会导致多次的进位(求关)
(在你的基础上修改的)Code:
#include<bits/stdc++.h>
using namespace std;
int a[100005]={0},len=1,cnt=0;
void jiecheng(int n,int x){
memset(a,0,sizeof a);
len=1;
cnt=0;
a[1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=len;j++){
a[j]*=i;
}
for(int j=1;j<=10000;j++){
a[j+1]+=a[j]/10;
a[j]%=10;
}
for(int j=10000;j>=0;j--)
{
if(a[j]!=0)
{
len=j;
break;
}
}
}
for(int i=1;i<=len;i++){
if(a[i]==x){
cnt++;
}
}
cout<<cnt<<'\n';
return ;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t,n,a;
cin>>t;
while(t--){
cin>>n>>a;
jiecheng(n,a);
}
return 0;
}
by 210101zhaosicheng @ 2024-05-31 21:22:04
@zhouyuxuan2023
by zhouyuxuan2023 @ 2024-06-01 08:01:44
AC已关 谢谢
by zhouyuxuan2023 @ 2024-06-01 08:02:24
@210101zhaosicheng