因子和阶乘
时间限制: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
讲解:大概意思就是看n的阶乘中是用多少个素数的多少次方算的 例如825=3*52*11所以是一个3,两个5
,一个11,然后再统计824;以此类推
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int a[10000];
int main()
{
void fun();
int m,n,i,j,t,b[10010];
fun();
scanf("%d",&t);
while(t--)
{
memset(b,0,sizeof(b));
scanf("%d",&n);
for(i=n;i>=2;i--)
{
for(j=0;a[j]<=i;j++)
{ m=i;
while(m%a[j]==0)
{
b[a[j]]++;
m=m/a[j];
}
}
}
for(i=0;a[i]<=n;i++)
if(b[a[i]])
printf("%d ",b[a[i]]);
printf(" ");
}
return 0;
}
void fun()
{
int i,m,k,c=1,j;
a[0]=2;
for(i=3;i<=10000;i++)
{ k=0;
m=i;
for(j=2;j<=sqrt(m);j++)
if(m%j==0)
{
k=1;
break;
}
if(k!=1)
a[c++]=i;
}
// for(i=0;i<=10000;i++)
// printf("%d ",a[i]);
}