质方数
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最接近的质方数是多少?
现在,小明慢慢长大了,但依然很喜欢数字,最近,他迷上了质数和平方数,并且自己把质数的平方命名为“质方数”。
现在,他在研究这样一个问题:距离一个正整数N最接近的质方数是多少?
Input
输入数据第一行是一个正整数T(T<=20),表示有T组输入数据。
接下来T行,每行输入一个正整数N(1<=N<=10^8)。
接下来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;
}