算法 干货!!! 因子和阶乘 打卡第七天

【题目】

输入正整数n(2<=n<=100),把阶乘n!=123*…n分解成素因子相乘的形式,从小到大输出各个素数(2,3,5…)的指数。例如825=35511应表示成(0,1,2,0,1),表示分别有0,1,2,0,1个2,3,5,7,11.你的程序应忽略比最大素因子更大的素数(否则末尾会有无穷个0)
.
【样例输入】

5
53
【样例输出】

5!=3 1 1
53!=49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1

【分析】

因为a的m次方乘以a的n次方等于a的m乘以n次方,我们只需要把所有素因子对应的指数累加起来。所以我们一个数组p来保存对应的各个素数的指数,并标记最大的那个素因子的下标为maxp,最后循环输出到最大素因子的指数即可。注意到n<=100,这些素因子不会超过100,输出时忽略最后的0即可。再次强调:is_prime函数不适合特别大的n。

【代码】

#include<stdio.h>
#include<string.h>
int is_prime(int n)/*判断素数*/
{
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
            return 0;
    }
    return 1;
}
int prime[100],count=0;
int main()
{
    int n,p[100];
    for(int i=2;i<=100;i++)/*建立素数表*/
    {
        if(is_prime(i)>0)
        {
            prime[count++]=i;
        }
    }
    while(scanf("%d",&n)==1)
    {
        printf("%d=",n);
        memset(p,0,sizeof(p));/*初始化数组*/
        int maxp=0;
        for(int i=1;i<=n;i++)
        {
            int m=i;/*不能直接修改i*/
            for(int j=0;j<count;j++)
            {
                while(m%prime[j]==0)
                {
                    m/=prime[j];
                    p[j]++;
                    if(j>maxp)
                        maxp=j;/*更新最大素因子下标*/
                }
            }
        }
        for(int i=0;i<=maxp;i++)
        {
            printf(" %d",p[i]);/*不考虑最大素数以外的数字*/
        }
        printf("\n");
    }
    return 0;
}

【补充】

数学是算法的基石。很多算法竞赛中都有一些数学味很浓的题。所以,要学好数学呀呀呀!!!

【寄语】

也许终点只有绝望和失败,但这绝不是停止前行的理由。
所以,加油肝!

发布了22 篇原创文章 · 获赞 19 · 访问量 5892

猜你喜欢

转载自blog.csdn.net/qq_45748475/article/details/104323504