C++求助 全WA

P1591 阶乘数码

fuguizait @ 2022-11-23 20:38:01

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int A[5001];

//int len = 1; //阶乘n的位数
//1.高精度*低精度
void mul(int &len, int k)
{
    int g = 0, i; //进位
    for (i = 0; i < len; i++)
    {
        A[i] = A[i] *k + g;
        g = A[i] / 10; //进位
        A[i] = A[i] % 10; //保留个位数
        //if (A[len])
        //    len++;
    }
    //处理最高位溢出:
    while(g > 0) //还有进位,进位不为0
    {
        A[i] = g / 10;
        g %= 10;
        i++;
    }
    len = i - 1;

}
//打印函数:
void  printInt(int &len, int x)
{
    int num = 0;
    for (int i = len - 1; i >= 0; i--)
    {
     if (A[i] == x)
        num++; 
    }

    cout << num << endl;
}

int main(void)
{

    int t;
    cin >> t;//t行数据

    while(t--) //查询次数
    {
        int len = 1;
        //数组初始化为0:
        for (int i = 0; i <= 5000; i++)
            A[i] = 0;
        A[0] = 1; //1! = 0;

        int n = 0, a = 0;
        cin >> n >> a;//n的阶乘 求a出现的次数

        for (int i = 2; i <= n; i++)
         mul(len, i);

        printInt(len, a);

    }

    return 0;
}

by super_LD @ 2022-11-28 15:27:32

你这个数组第二次没有清零。还是会有数据的。


by xingcode @ 2022-12-06 18:29:09


#include<bits/stdc++.h>//万能头
using namespace std;
int a[2600],t,n,q,s;//存放数组
int main()
{
cin>>t;//输入数据组数

for(int k=1;k<=t;k++)
{
    s=0;//归0
    cin>>n>>q;
    memset(a,0,sizeof(a));//别忘了清零!!!
    a[0]=1;//1!=1
    for(int i=1;i<=n;i++)
    {
        int x=0;//进位数
        for(int j=0;j<=2599;j++)
        {
            a[j]=a[j]*i+x;//高精
            x=a[j]/10;//进位
            a[j]%=10;
        }

    }
    bool f=0;//做标记
    for(int j=2599;j>=0;j--)//去除前缀0
    {
        if(a[j]!=0)//非0,开始
        {
            f=1;//标记为真
        }
        if(f)
            //f为真,开始判断
        {
            if(a[j]==q)//相同
            {
                s++;
            }
        }
    }
    cout<<s<<endl;//输出
} 

return 0;//好习惯
}

|