1215: 质方数
Time Limit: 1 Sec Memory Limit: 128 MBDescription
小z很喜欢研究各种各样的数字,最近他迷上了质数和平方数,他把一个质数的平方命名为”质方数”,现在他想知道,给出一个正整数,距离这个正整数最近的质方数是什么?(如果有2个距离相等的质方数,选择较小的一个)
Input
输入数据组数为T(T<=50),每组数据输入一个正整数n,其中1<=n<=100,000,000;
Output
对于每个测试样例,输出距离最近的质方数,每个样例占一行。
Sample Input
2
3
8
Sample Output
4
9
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 120000 //对质方数的最大值开平方取打表范围
int c[N]={0};
void p() //素数打表
{
int i,j;
c[1]=1;
for(i=2;i*i<N;i++)
if(c[i]==0)
for(j=i+i;j<N;j+=i)
c[j]=1;
}
int f(int k)
{
int i,j,m,t;
for(i=j=k;i>=1||j<N;i--,j++)//两头找质方数,先判断小的
{
m=sqrt(i);
if(c[m]==0&&m*m==i) //i开方可能是小数,需要再次判断被开方后的平方是否等于i
{
t=i;break;
}
m=sqrt(j);
if(c[m]==0&&m*m==j)
{
t=j;break;
}
}
return t;
}
int main()
{
int k,n;
p();
cin>>n;
while(n--)
{
cin>>k;
cout<<f(k)<<endl;
}
return 0;
}
注意:(int)sqrt(k)的平方不一定等于k,小数强制转换成int型会取整。