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

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

  • 相关阅读:
    2020年9月12日 线程的安全问题:同步方法;
    2020年9月12日 线程的安全问题:线程使用共享数据 产生的安全问题
    2020年9月11日 编写龟兔赛跑的多线程程序
    2020年9月9日 为什么要有包装类、包装类有哪些、装箱与拆箱、包装类的API、包装类对象的缓存问题
    2020年9月4日 try catch finally遇见return的时候返回值是啥?(面试题)
    2020年9月4日 异常
    2020年9月4日 异常处理
    2020年9月3日 内部类总结
    2020年9月3日 静态导入
    2020年9月3日 自定义注解和元注解
  • 原文地址:https://www.cnblogs.com/Ivy-End/p/4274818.html
Copyright © 2011-2022 走看看