n!的分解

[复制链接]
471|5
 楼主| functions 发表于 2019-9-14 18:02 | 显示全部楼层 |阅读模式
Description
给你一个数 n (1 < n <= 1000000) ,求 n! (n的阶乘)的质因数分解形式,质因数分解形式为
n=p1^m1*p2^m2*p3^m3……
*  这里 p1 < p2 < p3 < …… 为质数
*  如果 mi = 1, 则   ^ mi   就不需要输出

 楼主| functions 发表于 2019-9-14 18:03 | 显示全部楼层
Input


输入是多case的,每行一个数n,1 < n <= 1000000,当n等于0时输入结束

Output


每个n输出一行,为它的质因数分解形式
 楼主| functions 发表于 2019-9-14 18:03 | 显示全部楼层
Sample Input


6
7
0

Sample Output


6=2^4*3^2*5
7=2^4*3^2*5*7
 楼主| functions 发表于 2019-9-14 18:04 | 显示全部楼层
题意:给出n,将n!分解成质因子相乘的形式。

在这里如果每次给出n并且去求小于n的质因子,肯定会超时,因此可以先把1000000以内的质数求出来存在数组里,后面需要直接调用,并且这里求质数不能采用简单的试除法去求,那样效率很低,这里我们采用筛选法求解。
 楼主| functions 发表于 2019-9-14 18:05 | 显示全部楼层
  1. #include<iostream>
  2. #include<math.h>
  3. using namespace std;

  4. bool isprime[1000001];
  5. int prime[80000];
  6. int num=0;

  7. void getPrime()     //用筛选法求算素数
  8. {
  9.     int i,j;
  10.     for(i=0;i<1000001;i++)
  11.     {
  12.         isprime[i]=true;
  13.     }
  14.     for(i=2;i<=1000;i++)        //如果isprime[i]==true,即i是素数,那么i,2*i,3*i必定不是素数
  15.     {
  16.         for(j=i+i;j<=1000000;j+=i)
  17.         {
  18.             if(isprime[i]==true)
  19.                 isprime[j]=false;
  20.         }
  21.     }
  22.     for(i=2;i<1000001;i++)
  23.     {
  24.         if(isprime[i]==true)
  25.         {
  26.             prime[num++]=i;
  27.         }
  28.     }
  29. }

  30. int count(int n,int k)         //求n!中含有某因子k的个数
  31. {
  32.     int num=0;
  33.     while(n)
  34.     {
  35.         num+=n/k;
  36.         n=n/k;
  37.     }
  38.     return num;
  39. }


  40. int main(void)
  41. {
  42.     int n;
  43.     getPrime();
  44.     while(scanf("%d",&n)==1&&(n>1&&n<=1000000))
  45.     {
  46.         int i,j;
  47.         int m;
  48.         for(i=0;i<num;i++)
  49.         {
  50.             if(prime[i]>n)
  51.                 break;
  52.         }
  53.         printf("%d=",n);
  54.         for(j=0;j<i-1;j++)
  55.         {
  56.             m=count(n,prime[j]);
  57.             if(m>1)
  58.                 printf("%d^%d*",prime[j],m);
  59.             else
  60.                 printf("%d*",prime[j]);
  61.         }
  62.         m=count(n,prime[j]);
  63.         if(m>1)
  64.             printf("%d^%d\n",prime[j],m);
  65.         else
  66.             printf("%d\n",prime[j]);        
  67.     }
  68.     return 0;
  69. }
 楼主| functions 发表于 2019-9-14 18:05 | 显示全部楼层
作者:Matrix海子
    
出处:http://www.cnblogs.com/dolphin0520/
    
本博客中未标明转载的**归作者Matrix海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在**页面明显位置给出原文连接,否则保留追究法律责任的权利。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

446

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部