zoukankan      html  css  js  c++  java
  • 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;
    }
    

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

  • 相关阅读:
    uva10341
    android_定义多个Activity及跳转
    阿里巴巴2014年校园招聘(秋季招聘)在线笔试--測试研发project师
    关于程序猿的几个阶段!
    【Spring】Spring学习笔记-01-入门级实例
    感知器算法(二分类问题)
    Ubuntu14.04下安装ZendStudio10.6.1+SVN出现Failed to load JavaHL Library
    EF架构~关系表插入应该写在事务里,但不应该是分布式事务
    EF架构~在global.asax里写了一个异常跳转,不错!
    EF架构~为导航属性赋值时ToList()的替换方案
  • 原文地址:https://www.cnblogs.com/Ivy-End/p/4274818.html
Copyright © 2011-2022 走看看