全WA???

P1591 阶乘数码

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


|