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

SGU[113] Nearly prime numbers

时间:2015-02-05 14:53:15      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

SGU[113] Nearly prime numbers

标签:

原文地址:http://www.cnblogs.com/Ivy-End/p/4274818.html

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