zoukankan      html  css  js  c++  java
  • 《算法竞赛入门经典》5.42数学基础-因子和阶乘

    输入正整数n(2<=n<=100),把阶乘n!=1*2*3*…*n分解成素因子相乘的形式,从小到大输出各个以(2、3、4、5…)的指数。例如825=3*5*5*11应表示成(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

     1 #include <stdio.h>
     2 #include <string.h>
     3 //素数判定
     4 /* do NOT use this if x is very large or small
     5 *n太小时n=1会被错误地判断为素数,太大时i*i可能溢出
     6 */
     7 int is_prime(int n)
     8 {
     9     int i;
    10     for(i = 2; i*i <= n; i++)   //判断不超过sqrt(x)的整数i
    11         if(n % i ==0) return 0; //一旦发现有一个大于1的因子,立刻返回0(假)
    12     return 1;                   //最后返回1(真)
    13 }
    14 
    15 //素数表
    16 int prime[100], count = 0;
    17 int main()
    18 {
    19     //变量i,n和各个素数的指数
    20     int i, n, p[100];
    21     //构造素数表
    22     for(int i = 2; i <= 100; i++)
    23         if(is_prime(i)) prime[count++] = i;
    24     while(scanf("%d", &n) == 1)
    25         {
    26             printf("%d! =", n);
    27             memset(p, 0, sizeof(p));            //string.h
    28             int maxp = 0;                        //定义最大素数因子下标并赋初值
    29             for(i = 1; i <= n; i++)
    30             {
    31                 //必须把i复制到变量m中,而不要在做除法时直接修改它
    32                 int m = i;
    33                 for(int j = 0; j < count; j++)
    34                     while(m % prime[j] == 0)    //反复除以prime[j],并累加p[i]
    35                     {
    36                         m /= prime[j];
    37                         p[j]++;
    38                         if(j > maxp) maxp = j;    //更新最大素数因子下标
    39                     }
    40             }
    41             //只循环到最大下标
    42             for(i = 0; i <= maxp; i++)
    43                 printf(" %d", p[i]);
    44             printf("
    ");
    45         }
    46     return 0;
    47 }
    View Code

    分析:
      因am×an=a(m+n),则只需把所有素因子对应的指数累加起来;注意到n<=100,这些素因子不会超过100,输出时忽略到最后的0即可。

    亲爱的读者:如果觉得本文对你有所帮助,请点击推荐,分享给其他人!
  • 相关阅读:
    tomcat部署web服务,验证码刷新不出来
    deployment模板实例
    acme
    私有registry及证书配置
    kubernetes监控
    kubernetes中安装efk
    kubernetes v1.13.1集群
    etcd集群
    centos-src
    比较两三个字段的最大值
  • 原文地址:https://www.cnblogs.com/zhuangwei/p/5346634.html
Copyright © 2011-2022 走看看