因子和阶乘


时间限制: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分解成素因子相乘后各个素因子对应的指数 样例输入

2
5
53

样例输出

3 1 1
49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1



#include<stdio.h>
#include<math.h>
#include<string.h>
#define N 10005
bool visit[N]={1,1,0};
int b[2000];//素数定理 ,N/lnN
void Prime()
{
int i,j,k=0;
int m=(int)(sqrt(N)+0.5);
for(i=2;i<m;i++)
if(!visit[i])
for(j=i*i;j<N;j+=i)
visit[j]=1;
for(i=2;i<N;i++)
if(!visit[i]) b[k++]=i;//实际上直接在第二层for之上加上b[k++]=i即可
}
int cnt(int n,int m)//n!含几个m
{
int ans=0;
while(n>0)
{
n=n/m;
ans+=n;
}
return ans;
}
int main()
{
int i,j,k,m,n;
Prime();
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
for(i=0;b[i]<=m;i++)/*有 b[i]<=m实际上已经限制了不会输出素数指数为0的 指数 */
printf("%d ",cnt(m,b[i]));//另外最后的i表示m含有几个不同的素因子
putchar('\n');
}
}


或者
/*不同质因子个数

while(n)

{

if(n%prim[i]==0)

{

cnt++;

while(n%prim[i]==0)

n/=prim[i];

}

i++;

}


/*
求a!因式中有多少个b(b是素数)
那么a / b 表示 在 1 到 a 中所有的数中有a/b个能够整除b
a / (b^2) 表示在 1 到 a 中所有的数中有a/(b^2)个能够整除b^2
……
因此,总共有a/b + a / b^2 + a / b^3 + …… 直到a/ b^n 等于0




注释:2是足够的关键看有几个5,以100为例,先除以5,除尽的有5,10,15,20,……100等20个数,
得到1,2……20;再除以5,除尽的有5,10,15,20这4个数;于是共24个5,即24个0。因此看出来求n!含有几个x,实际是看1到n各个数各有几个x;最后再相加

于是但求某个数n含有几个x ,比如12含有2个2;先12%2=0,则有一个2;12/2=6, 6%2=0,则有两个2了;6/2=3,3%2=1!=0;则总共2个2
*/


  


作者:​​火星十一郎​

)

本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.