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

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

  • 相关阅读:
    pytorch空间变换网络
    Jittor 的Op, Var算子
    元算子卷积层实现
    Caffe实现概述
    Halide视觉神经网络优化
    旷视MegEngine数据加载与处理
    旷视MegEngine网络搭建
    旷视MegEngine基本概念
    Torchvision模型微调
    新的一天
  • 原文地址:https://www.cnblogs.com/Ivy-End/p/4274818.html
Copyright © 2011-2022 走看看