题目链接: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; }
时间: 2024-10-03 03:08:09