SGU[113] Nearly prime numbers

Description

描述

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

输入

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。所有的数字以空格隔开。


Output

输出

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”。


Sample Input

样例输入

1
6


Sample Output

样例输出

Yes

 

Analysis

分析

考虑到数据范围不是很大,109以内仅有五千多万个质数,可以通过打表来解决。打表自然是筛法求素数。

每次读入数据以后,只要比较到 sqrt(X) 就可以了,这样我们就可以在O(√n)的时间内求出结果。

这里有个小小的注意点,我们在循环的时候,最好使用i * i <= X来代替i <= sqrt(X) + 1,因为后者容易产生浮点数误差。

 

Solution

解决方案

#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;
}

 

这道题目可以用来练习使用筛法求素数,题目本身并不具有很强的思考性。

posted @ 2015-02-05 14:46  Ivy_End  阅读(258)  评论(0编辑  收藏  举报