计算阶层码数:求n!中某个码数出现的次数

代码导航 毕业设计 1
#include <iostream>
#include <string>

using namespace std;
int c[3000];
void s2BIG(string s,int a[]){
    int l=s.length();
    for(int i=1;i<=l;i++)
    {
        a[i]=s[l-i]-'0';
    }
    a[0]=l;
}

void addBIG(int a[],int b[],int c[])
{
    int al=a[0],bl=b[0],cl=max(al,bl);
    for (int i=1;i<=cl;i++){
        int t=0;
        if(i<=al)
        {
            t+=a[i];
        }
        if(i<=bl)
        {
            t+=b[i];
        }
        c[i]=t;
    }
    for (int i=1;i<cl;i++)
    {
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    while(c[cl]>10)
    {
        c[cl+1]=c[cl]/10;
        c[cl]%=10;
        cl++;
    }
    c[0]=cl;
}
void printBIG(int a[])
{
    for(int i=a[0];i>=1;i--)
    {
        cout<<a[i];
    }
}
void mulBIG(int a[],int b,int c[])
{
    int al=a[0],cl=al;
    long long t[1005]={};
    for(int i=1;i<=cl;i++)
    {
        t[i]=a[i]*b;
    }
    for(int i=1;i<cl;i++)
    {
        t[i+1]+=t[i]/10;
        t[i]%=10;
    }
    while(t[cl]>=10)
    {
        t[cl+1]=t[cl]/10;
        t[cl]%=10;
        cl++;
    }
    for(int i=1;i<=cl;i++)
    {
        c[i]=t[i];
    }
    c[0]=cl;
}
int main(){
    int n,a;
    cin>>n>>a;
    s2BIG("1",c);
    for(int i=1;i<=n;i++)
    {
        mulBIG(c,i,c);
    }
    int cnt=0;
    for(int i=1;i<=c[0];i++)
    {
        if(c[i]==a)
        {
            cnt++;
        }
    }
    cout<<cnt;
    return 0;
}

回复

共2条回复 我来回复
  • 源码项目助手
    这个人很懒,什么都没有留下~
    评论

    啥叫码数?是指8的阶乘的结果中有几个4吗?可以定义连个函数,一个求阶乘,一个判断阶乘中4的个数

    // 1000 的阶乘 2568 位  
    #include <stdio.h>  
    int a[3000];  
    
    int fanc(int n)  
    {  
        int w=0;  
        int i=0, j=0;  
        int t=n;  
        int k=0;    // 表示数据的位数。  
    
        i=0, k=0;  
        while(t)  
        {  
            a[i++] = t%10;  
            t/=10;  
            k++;  
        }  
    
        for (j=n-1; j>1; j--)  
        {  
            w=0;    // 表示进位  
            for (i=0; i<k; i++)  
            {  
                t = a[i]*j+w;  
                a[i] = t%10;  
                w = t/10;  
            }  
    
            while(w)  
            {  
                a[i++] = w%10;  
                w/=10;  
                k++;  
            }  
        }  
        return k;  
    }  
    
    int getp(int k,int p)
    {
        int i=0,count=0; 
        for (i=k-1; i>=0; i--)  
        {  
           if(a[i] == p)
            count++;
        }  
        return count;
    }
    
    int main()  
    {  
        int n,p=0,num=0;  
        int k=0;  
    
        scanf("%d%d",&n,&p);  
        k = fanc(n);  
        num = getp(k,p);
        printf("%d共有%d个\n",p,num); 
        return 0;  
    } 
    
    0条评论
  • 毕业设计工坊
    这个人很懒,什么都没有留下~
    评论
    #include <iostream>
    using namespace std;
    int fact(int n)
    {
        int res = 1;
        for (int i = 1; i <= n; i++)
        {
            res *= i;
        }
        return res;
    }
    int cal(int n, int k)
    {
        int res = 0;
        while (n != 0)
        {
            if (n - n / 10 * 10 == k)
            {
                res++;
            }
            n /= 10;
        }
        return res;
    }
    int main()
    {
        int n, k; cin >> n >> k;
        int f = fact(n);
        int res = cal(f, k);
        cout << res << endl;
    }
    

    0条评论

发表回复

登录后才能评论