码迷,mamicode.com
首页 > 其他好文 > 详细

UVALIve 5987 素数

时间:2015-08-21 22:49:36      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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 = 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

 

UVALIve 5987 素数

标签:

原文地址:http://www.cnblogs.com/icode-girl/p/4749131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!