标签:
Nearly prime number is an integer positive number for which it is possible to find such primes P1 and P2 that given number is equal to P1*P2. There is given a sequence on N integer positive numbers, you are to write a program that prints “Yes” if given number is nearly prime and “No” otherwise.
近似质数是由两个质数P1、P2组成的正整数P1 * P2。给定一系列的正整数N,你需要写一个程序来判断它是否是近似质数,如果是,输入出“Yes”,否则输出“No”。
Input file consists of N+1 numbers. First is positive integer N (1£N£10). Next N numbers followed by N. Each number is not greater than 109. All numbers separated by whitespace(s).
输入文件包含N + 1个数,第一个是正整数N(1 <= N <= 10),接下来N个数,每个数不超过109。所有的数字以空格隔开。
Write a line in output file for each number of given sequence. Write “Yes” in it if given number is nearly prime and “No” in other case.
对于给定的每个数字,如果是近似质数,则输出“Yes”,否则输出“No”。
1
6
Yes
考虑到数据范围不是很大,109以内仅有五千多万个质数,可以通过打表来解决。打表自然是筛法求素数。
每次读入数据以后,只要比较到 sqrt(X) 就可以了,这样我们就可以在O(√n)的时间内求出结果。
这里有个小小的注意点,我们在循环的时候,最好使用i * i <= X来代替i <= sqrt(X) + 1,因为后者容易产生浮点数误差。
#include <iostream> #include <string> #include <vector> #include <memory.h> #include <math.h> using namespace std; const int MAX = 32000; bool pPrimes[MAX]; vector<int> pVec; int main() { unsigned long long N, x, y; memset(pPrimes, true, sizeof(pPrimes)); for(int i = 2; i < MAX; i++) { if(pPrimes[i]) { pVec.push_back(i); for(int j = i + i; j < MAX; j += i) { pPrimes[j] = false; } } } cin >> N; for(int i = 1; i <= N; i++) { cin >> x; bool bFlag = false; for(int j = 0; j < pVec.size(); j++) { if(x % pVec[j] == 0) { y = x / pVec[j]; bool bTmp = true; for(int k = 2; k * k <= y; k++) { if(y % k == 0) { bTmp = false; break; } } if(y <= 1) { bTmp = false; } if(y == 2) { bTmp = true; } if(bTmp) { bFlag = true; break; } } } if(bFlag) { cout << "Yes" << endl; } else { cout << "No" << endl; } } return 0; }
这道题目可以用来练习使用筛法求素数,题目本身并不具有很强的思考性。
标签:
原文地址:http://www.cnblogs.com/Ivy-End/p/4274818.html