质方数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3611 Accepted Submission(s): 1212
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
思路:模拟
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
typedef long long ll;
using namespace std;
const int maxn = 10010;
int prime;
bool isprime[maxn];
int loc[maxn];
int k;
void doprime()
{
k = 0;
int i,j;
memset(isprime,true,sizeof(isprime));
for(i=2; i<maxn; i++)
{
if(isprime[i])
{
loc[k++] = i*i;
for(j=i*i; j<maxn; j+=i)
{
isprime[j] = false;
}
}
}
}
int main()
{
int i;
doprime();
int t,n;
scanf("%d",&t);
while(t--)
{
int x;
scanf("%d",&n);
int min1 = INT_MAX;
for(i=0; i<k; i++)
{
if(abs(loc[i] - n) < min1)
{
x = i;
min1 = abs(loc[i] - n);
}
if(loc[i] >= n)
break;
}
printf("%d\n",loc[x]);
}
return 0;
}