救命!样例过了,不知道为什么,所有点都WA

P1591 阶乘数码

HITACorz @ 2021-03-15 16:08:36

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
int High[101000];

int JC(int n) {
    High[0] = 1;
    int i, j;
    int length = 1;
    //乘以各个数
    for (i = 2; i <= n; i++) {
        //依次计算
        for (j = 0; j < length; j++) {
            High[j] *= i;
        }
        //检测进位
        for (j = 0; j < length; j++) {
            if (High[j] > 9) {
                High[j + 1] += High[j] / 10;
                High[j] %= 10;
                //长度增加需要条件
                if (j == length - 1)
                    length++;
            }
        }
    }
    return length;
}

void Scan(int n, int a) {
    memset(High, 0, sizeof(int) * (n + 1));

    int i;
    int cnt = 0;
    int len = JC(n);
    for (i = 0; i < len; i++) {
        if (High[i] == a) {
            cnt++;
        }
    }
    cout << cnt << endl;
}

int main() {
    ios::sync_with_stdio(false);
    int t;
    int n, a;
    cin >> t;
    int i;
    for (i = 0; i < t; i++) {
        cin >> n >> a;
        Scan(n, a);
    }

    return 0;
}

我的思路是每次输入都计算阶乘,计算之前先把数组清空。算完保存再数组里,然后每次进行扫描计数,但是他全WA


by zzz209 @ 2021-03-15 19:35:57

把同步打开试试


by HITACorz @ 2021-03-16 15:21:12

@zzz209 还是全WA,哭了?


by HITACorz @ 2021-03-16 21:16:16

球球了,快来人救一下吧


by zzz209 @ 2021-03-17 20:46:19

你自己琢磨一下

#include <stdio.h>
#include <iostream>
#include <string.h>
int a[20001],n,m,t,s;//n!,m是数码,t是有t位,s存答案,a数组是一串高精度数 
using namespace std;
inline int multe(int n)
{
    register int i,j;
    for(i=1;i<=t;i++)//先让a数组的每一位都能乘以n 
    {
        a[i]*=n;
    }
    for(i=1;i<=t;i++)//从1到位数进行循环 
    {
        if(a[i]>9)//如果需要进位 
        {
            a[i+1]+=a[i]/10;//进位 
            a[i]%=10;
            if(i+1>t)//如果现在是最高位 
            {
                t++;//位+1 
            }
        }
    }
    return 0;
}
inline void lxydl()//lxy大佬太强啦! 
{
    for(register int i=t;i>=1;i--)//这个倒或正可能无所谓吧,但是高精度后出来的数字都是倒序的,那我们也倒叙 
    {
        if(a[i]==m)//如果当前的a[i]等于数 
        {
            s++;//算符+1 
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    register int i,j,l;//l是l组数据 
    cin>>l;
    while(l--)
    {
        cin>>n>>m;
        s=0;//答案初始化 
        memset(a,0,sizeof(a));//清除缓存 
        a[1]=1;//假设第一位数为1,否则0乘任何数都是0 
        t=1;//至少有1位 
        for(i=1;i<=n;i++)//求n! 
        {
            multe(i);//a数组乘以i 
        }
        lxydl();//找n!里有多少m这个数 
        cout<<s<<endl;//输出答案 
    }
    return 0;
}

上面代码是我转载后修改的。自己琢磨


by HITACorz @ 2021-03-17 20:54:51

@zzz209 谢谢谢谢大佬,orz感激不尽!


by HITACorz @ 2021-03-17 21:25:47

刚刚我修改了一下我的代码,Scan方法中的memset中的size设置不合适,我设置成n+1了,改成sizeof(High)就AC了!!!!!!!!!!


by zzz209 @ 2021-03-17 21:36:28

@HITACorz 不用谢


by zzz209 @ 2021-03-17 21:36:55

我也是蓝名


|