目录
1.题目描述
问题 G: 单纯质因数
时间限制: 1.000 Sec 内存限制: 128 MB
题目描述
读五年级的楠楠刚学完了质数、合数、因数、质因数等概念。
他还知道了每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,叫做这个合数的质因数.把一个合数用质因数相乘的形式表示出来,叫做分解质因数.
聪明爱动脑筋的楠楠突然对具有互不相同的质因数的合数产生了兴趣。例如:30=2*3*5,它有互不相同的质因数;70=2*5*7,它也有互不相同的质因数。若一个合数中所有的质因数互不相同,则把它称之为具有单纯质因数的合数。他想知道还有哪些数是单纯质因数的合数。
你现在要帮楠楠解决的问题是:已知N,依次输出N以内所有具有单纯质因数的合数。
输入
输入数据只一个整数N(10<=N<=100000)。
输出
依次输出N以内所有具有单纯质因数的合数。
样例输入
12
样例输出
6 10
2.代码
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
int n,num=0;
int a[100010],s[200010],v[100010]={0};
int f1(int x)
{
int y=sqrt(x);
for(int i=2;i<=y;i++)
{
if(x%i==0)
{
return 0;
}
}
return 1;
}
int f2(long long sum,int i)
{
if(sum>n)
{
return 0;
}
s[sum]=1;
for(int j=i+1;j<num;j++)
{
long long t=sum*a[j];
if(t>n) return 0;
f2(t,j);
}
return 0;
}
int f1(int x);
int f2(long long sum,int i);
int main()
{
cin>>n;
a[num++]=2;
for(int i=3;i<=n;i++)
{
if(f1(i)==1)
{
if(i<=n/2)
a[num++]=i;
}
else v[i]=1;
}
for(int i=0;i<num;i++)
{
f2(a[i],i);
}
for(int i=6;i<=n;i++)
{
if(v[i])
if(s[i]) cout<<i<<" ";
}
return 0;
}