题目链接:Distinct Primes
如果一个数。至少有三个因子是素数、。那么这个数就是prime num.30和42是前两个prime num.问你第n个这种数是谁。(1<=n<=1000)。
用质因子分解。判断每个数有多少个因子是质数。如果超过3个旧记录下来、记录前1000个。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
using namespace std; typedef long long ll;
#define N 5000
int isprime[N];
ll prime[N], nprime, factor[N], numfactor[N], ct; void makeprime() // 打出1到N的素数表。
{
int i, j, temp;
nprime = ;
memset(isprime, , sizeof(isprime));
isprime[] = ;
temp = sqrt(N+0.0);
for (i=; i<=temp; ++i)
{
if (isprime[i])
{
for (j=i+i; j<N; j+=i)
{
isprime[j] = ;
}
}
}
for (int i=; i<N; ++i)
{
if (isprime[i]) prime[nprime++] = i;
}
} int divide(int n) // 对n进行质因子分解。ct表示质因子的个数、
{
int i;
int temp = sqrt(n+0.0);
ct = ;
memset(numfactor, , sizeof(numfactor));
for (i=; i<=nprime; ++i)
{
if (prime[i] > temp) break;
if (n % prime[i] == )
{
factor[++ct] = prime[i];
while(n % prime[i] == )
{
n /= prime[i];
}
}
}
if (n != )
{
factor[++ct] = n;
}
return ct;
} int main()
{
int num[], cnt = ;
makeprime();
for (int i=; ; ++i)
{
if (divide(i) >= ) num[cnt++] = i;
if (cnt > ) break;
}
int t, n;
cin >> t;
while(t--)
{
cin >> n;
cout << num[n-] << endl;
}
return ;
}