杭电校赛(质方数)

质方数

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


你可能感兴趣的:(杭电校赛(质方数))