全WA,悬赏关注求Debug

P1591 阶乘数码

0neKbyte @ 2024-10-27 19:45:21

#include<iostream>
using namespace std;
int num1[10005], num2[10005], times, w1, w, sum;
int main(){
    int t;
    scanf("%d", &t);
    int n[t]={}, a[t]={};
    for(int i=0; i<t; i++){
        scanf("%d %d", &n[i], &a[i]);
    }num1[0]=1;
    for(int i=1; ; i++){
        for(int o=0; o<=w1; o++){
            num2[o]=num1[o];
            num1[o]=0;
        }for(int o=0; o<=w1; o++){
            num1[o]+=(num2[o]*i);
            if(num1[o]>=10){
                num1[o+1]=num1[o]/10;
                num1[o]=num1[o]%10;
            }
            if(num1[o+1]){
                w=max(o+1, w1);
            }
        }w1=w;
        for(int j=0; j<t; j++){
            if(i==n[j]){
                sum=0;
                times++;
                for(int p=0; p<=w; p++){
                    if(num1[p]==a[j]) sum++;
                }printf("%d\n", sum);
            }
        }if(times==t)return 0;
    }
}

by wuyusheng @ 2024-10-27 19:59:56

@0neKbyte 你的代码用的是高精吗,怎么看不懂?


by wuyusheng @ 2024-10-27 20:00:21

@0neKbyte 我的代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,n,a1[3000],cnt[2000],t;
    cin>>t;
    int t2=t;
    while(t--)
    {
        memset(a1,0,sizeof(a));
        cin>>n>>a;
        a1[1]=1;
        int l=1,j,jw=0;
        for(int i=1; i<=n; i++)
        {
            jw=0;
            for(j=1;j<=l;j++)
            {
                a1[j]=a1[j]*i+jw;
                jw=a1[j]/10;
                a1[j]=a1[j]%10;
            }
            while(jw!=0)
            {
                a1[j]=jw%10;
                jw/=10;
                j++;
            }
            l=j-1;
        }
        for(int i=1; i<=l; i++)
        {
            if(a1[i]==a)
            cnt[t2-t]++;
        }
    }
    for(int i=1; i<=t2; i++)
    {
        cout<<cnt[i]<<endl;
    }
    return 0;
}

by 0neKbyte @ 2024-10-27 20:49:59

@wuyusheng 是高精,但是我改了一下

num1是乘运算后的结果

每次num2乘以i,最后赋值给num1.w1和w是num1的位数

每当i等于列表n的某一个数值时统计a出现的次数,本质过程我们差不多,只不过你每次都把al重置重新算罢了


|