2015杭电新生赛1004质方数【打素数表】

质方数

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3647    Accepted Submission(s): 1222


Problem Description
  小明天生对数字比较敏感,3岁的时候就能背诵圆周率一百位。

  现在,小明慢慢长大了,但依然很喜欢数字,最近,他迷上了质数和平方数,并且自己把质数的平方命名为“质方数”。
  现在,他在研究这样一个问题:距离一个正整数N最接近的质方数是多少?
 

Input
输入数据第一行是一个正整数T(T<=20),表示有T组输入数据。
接下来T行,每行输入一个正整数N(1<=N<=10^8)。
 

Output
对于每组数据,请输出距离N最接近的质方数,每组输出占一行。
 

Sample Input
   
   
   
   
2 1 10
 

Sample Output
   
   
   
   
4 9
 

打个表就行。
#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstring>
using namespace std;

int prm[100000];
const int MAXV = 1e5; 
bool isPrime[MAXV+1]; 
int size=0; 
void getPrime()  
{  
    memset(isPrime, true, sizeof(isPrime));
    int sq = sqrt((double)MAXV) + 1; 
    int i,j,k;  
    for(i = 2;i <= sq; i++)  
        if(isPrime[i])  
	for(j = 2,k = MAXV/i+1;j < k;j++)  
	    isPrime[i*j] = false;  
    for( i = 2 ; i <= MAXV; i++)  
        if(isPrime[i])    
            prm[size++] = i;
    isPrime[0] = isPrime[1] = false;
}  

int main(void)
{
	int t;
	cin>>t;
	getPrime();
	//cout<<prm[0]<<"\n";
	while(t--)
	{
		int n;
		cin>>n;
		if(n<4)cout<<"4\n";
		else
		{
			bool flag=1;
			long long a,b;
			for(int i=0 ; i<size ; ++i)
			{
				if((long long)prm[i]*prm[i] < n)
				{
					a=prm[i]*prm[i];
				}
				else
				{
					b=prm[i]*prm[i];
					break;
				}
			}
			if(n-a<b-n)cout<<a<<"\n";
			else cout<<b<<"\n";
		}
	}
	return 0;
}


你可能感兴趣的:(C++,算法,ACM,杭电)