您的位置:首页 > 其它

UVALIve 5987 素数

2015-08-21 21:59 204 查看
题目链接: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
;
ll prime
, nprime,  factor
, numfactor
, ct;

void makeprime()  // 打出1到N的素数表。
{
int i, j, temp;
nprime = 0;
memset(isprime, 1, sizeof(isprime));
isprime[1] = 1;
temp = sqrt(N+0.0);
for (i=2; i<=temp; ++i)
{
if (isprime[i])
{
for (j=i+i; j<N; j+=i)
{
isprime[j] = 0;
}
}
}
for (int i=1; i<N; ++i)
{
if (isprime[i]) prime[nprime++] = i;
}
}

int divide(int n)  // 对n进行质因子分解。ct表示质因子的个数、
{
int i;
int temp = sqrt(n+0.0);
ct = 0;
memset(numfactor, 0, sizeof(numfactor));
for (i=1; i<=nprime; ++i)
{
if (prime[i] > temp) break;
if (n % prime[i] == 0)
{
factor[++ct] = prime[i];
while(n % prime[i] == 0)
{
n /= prime[i];
}
}
}
if (n != 1)
{
factor[++ct] = n;
}
return ct;
}

int main()
{
int num[1001], cnt = 0;
makeprime();
for (int i=1; ; ++i)
{
if (divide(i) >= 3) num[cnt++] = i;
if (cnt > 1000) break;
}
int t, n;
cin >> t;
while(t--)
{
cin >> n;
cout << num[n-1] << endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: