算法篇——因子和阶乘

  来源:《算法竞赛入门经典》例题5.4.2

  题目:输入正整数n(2≤n≤100),把阶乘n!=1*2*3*...*n分解成素因子相乘的形式,从小到大输出各个素数(2、3、5...)的指数。例如,5! 表示为 3 1 1(5!=23*31*51=120),程序忽略比最大素因子更大的素数(否则末尾会有无穷多个0)

  样例输入
  5
  53
  样例输出:
  5! = 3 1 1
  53! = 49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1

  分析:
  注意到n<=100,所以素因子也一定不会超过100(可以用反证法证明如果存在大于100的素因子,这个素因子在等式上无法消去,等式不成立)。我们首先构造一张素数表,然后用阶乘的每个因子(从小到大)与素数表中的素数取模,能整出就证明该素数是素因子,并记录每一个素数的指数。因为am * an = am+n,所以我们只需把所有素因子对应的指数累加起来 。用一个数组p来保存对应的各个素数的指数,并标记最大的那个素因子的下标为maxp,最后循环输出到最大素因子的指数即可。

  源码

#include<stdio.h>
#include<string.h>

int is_prime(int n)
{
    int i;
    for(i=2;i*i<=n;i++)
        if(n%i==0)    return 0;
    return 1;
}

int main()
{
    int n,m,i,j,prime[100],p[100],maxp,count=0;//primer为素数表,p为素数表中各个素数对应的指数
                                               //count为素数表中素数的数量,maxp为最后可以输出的最大素因子对应于p的下标

    for(i=2;i<=100;i++)                        //构造素数素数表,素数因子一定不超过100
        if(is_prime(i))    prime[count++]=i;
    while(scanf("%d",&n)==1)
    {
        printf("%d! =",n);
        memset(p,0,sizeof(p));                 //各素数对应的指数置0
        maxp=0;                                //最大素因子索引置0
        for(i=1;i<=n;i++)
        {
            m=i;                               //阶乘的每个因子都循环除以(取模)素数表中的素数
            for(j=0;j<count;j++)
                while (m%prime[j]==0)          //能整出证明是素因子
                {
                    m/=prime[j];
                    p[j]++;                    //因子指数加1
                    if(j>maxp)    maxp=j;      //更新最大素因子下标
                }
        }
        for(i=0;i<=maxp;i++)                   //忽略比最大素因子更大的素数
            printf(" %d",p[i]);
        printf("\n");

    }
    return 0;
}
时间: 2024-10-25 19:17:05

算法篇——因子和阶乘的相关文章

深度学习word2vec笔记之算法篇

深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料的时候,经常会被叫去看那几篇论文,而那几篇论文也没有系统地说明word2vec的具体原理和算法,所以老衲就斗胆整理了一个笔记,希望能帮助各位尽快理解word2vec的基本原理,避免浪费时间. 当然如果已经了解了,就随便看看得了. 一. CBOW加层次的网络结构与使用说明 Word2vec总共有两种类

插入排序——一步一步算法篇

插入排序 算法思想:将待排序的数据放在一个数组中,并设置一个中间量m,用来存储每次插入比较的元素. (1) a[1]自成1个有序区,无序区为a[2..n]; (2) 从i=2起直至i=n为止,将a[i]放在恰当的位置,使a[1..i]数据序列有序; ① m:=a[i]; ② 将m与前i-1个数比较 , j:=i-1; while(x #include<iostream> #include<cstdio> #include<cstring> #include<str

因子和阶乘

因子和阶乘 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给你一个正整数n,把n!=1x2x3x.....xn分解成素因子相乘的形式,并从小到大输出每个素因子的指数,但要保证最后输出的素因子个数不为0.例如825应表示为0,1,2,0,1表示分别有0,1,2,0,1个2,3,5,7,11. 输入 第一行有一个整数n(0<n<10000),表示有n组测试数据: 接下来n行每行有一个整数 m(1<m<10000) 输出 从小到大输出m分解成素因子相乘后各

冒泡排序——一步一步算法篇

基本思想:依次比较相邻的两个数,并两两交换,使大(或小)的数不停向前推进,以此类推-- 由于在排序过程中总是大数往前,小数往后,相当气泡上升,所以叫冒泡排序. #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; int main() { int n,a[1000],i,j,k,m; cin>>n; memset(a,

算法篇——阶乘的精确值

来源:<算法竞赛入门经典>例题5.2.2 题目:输入不超过1000的正整数n,输出n!=1*2*3*…*n的精确结果. 样例输入:30 样例输出:265252859812191058636308480000000 分析:为了保存结果,需要分析1000!有多大.用计算器算一算不难知道,1000!约等于4*102567,因此可以用一个3000个元素的数组buf保存.为了方便起见,我们让f[0]保存结果的个位,f[1]是十位,f[2]是百位……(为什么要从低位逆序表示呢?因为如果从低位顺序表示,一旦

有赞搜索引擎实践(算法篇)

## 1. 搜索算法总体架构 在上篇文章(工程篇)中, 我们介绍了有赞搜索引擎的基本框架. 搜索引擎主要3个部件构成. 第一, hadoop集群, 用于生成大规模搜索和实时索引; 第二,  ElasticSearch集群, 提供分布式搜索方案; 第三, 高级搜索集群, 用于提供商业搜索的特殊功能. 商业电商搜索由于搜索的特殊性, 独立的ElasticSearch集群是无法满足多样的算法需求的, 我们在搜索的各个部件上都有相应的算法插件, 用于构建商业电商搜索引擎的算法体系. ### 1.1 索引

LDA工程实践之算法篇之(一)算法实现正确性验证(转)

研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiwang带领下,与孙振龙.严浩等一起实现了一套大规模并行的LDA训练系统——Peacock.受rick影响,决定把自己对LDA工程实践方面的一些理解整理出来,分享给大家,其中可能有一些疏漏和错误,还请批评指正. Rickjin在<LDA数学八卦>[1]一文中已经对LDA的数学模型以及基本算法介绍得比

[Java 泥水匠] Java Components 之二:算法篇之项目实践中的位运算符(有你不懂的

作者:泥沙砖瓦浆木匠 网站:http://blog.csdn.net/jeffli1993 个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节. 交流QQ群:[编程之美 365234583]http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_AonqzL0rpdQAjjqlHQQ 如果我的帮到了你,是否乐意捐助一下或请一杯啤酒也好呢?有你支持,干的更好~ 点这参与众筹 我的支付宝:13958686678 2.1 前言 自从上篇[Java 泥水

数据结构和算法篇——散列表

之前讲过博主在某网买了一个数据结构与算法的课程.本篇散列表是其中的三节.散列表应该是 Java 程序员常用并且最先碰到的一个数据结构了吧?Java 的 HashMap 就是对散列表的实现.可以说散列表算是一个比较基础.比较好理解(抛开需要缜密设计的哈希函数不说).比较好用(查询时间复杂度O(1))的一种数据结构.本篇在此分享这三节的总结笔记. 1)散列表开篇介绍:https://www.cnblogs.com/christmad/p/11519055.html 2)如何打造一个工业级的散列表:h