因子和阶乘
时间限制:
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(0<n<10000),表示有n组测试数据;
分析:
简单题,判断素数。从最小素数开始判断,如果能整除,就把这个素数指数加1,然后继续判断。开始提交TLE了,优化了一下:当一个数已经判断是素数的时候,记录它是素数,然后在后面遇到这个数时就不需要重复判断了。
LANGUAGE:C++
CODE:
<span style="font-size:18px;">#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
bool is_prime(int n)
{
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
return false;
return true;
}
int main()
{
int t;
cin>>t;
int n;
while(t--)
{
scanf("%d",&n);
int ans[10005]={0},cnt=0,maxn=2,vis[10005]={0};
// fill(ans,ans+10005,0);
for(int i=2;i<=n;i++){
if(is_prime(i)){
vis[i]=1;
ans[i]++;
if(i>maxn)
maxn=i;
}
else{
int t=i;
for(int j=2;t!=1;j++){
if(vis[j]){
if(j>maxn)
maxn=j;
while(t%j==0){
ans[j]++;
t/=j;
}
}
}
}
}
for(int i=2;i<=maxn;i++){
if(vis[i]){
printf("%d ",ans[i]);
}
}
printf("\n");
}
return 0;
}</span>