您的位置:首页 > 理论基础

hdu-- 计算机学院大学生程序设计竞赛(2015’11)

2015-11-29 23:45 357 查看


质方数

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3247 Accepted Submission(s): 1080



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

现在,小明慢慢长大了,但依然很喜欢数字,最近,他迷上了质数和平方数,并且自己把质数的平方命名为“质方数”。

现在,他在研究这样一个问题:距离一个正整数N最接近的质方数是多少?

[align=left]Input[/align]
输入数据第一行是一个正整数T(T<=20),表示有T组输入数据。

接下来T行,每行输入一个正整数N(1<=N<=10^8)。

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

[align=left]Sample Input[/align]

2
1
10


[align=left]Sample Output[/align]

4
9
code:
[code]#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define size 1000003
#define inf 0x3f3f3f3f
typedef long long ll;
int s[size];
using namespace std;
void prime(){
memset(s, 0, sizeof(s));//质数置为0
for(int i=2;i<size;i++){
if(!s[i]){
for(int j=i+i;j<=size;j+=i)
s[j]=1;//非质数置为1
}
}
s[1]=1;//非质数置为1
}
int main()
{
#ifdef OFFLINE
freopen("t.txt", "r", stdin);
#endif
prime();
int t, i,j;
ll a, b, k;
scanf("%d", &t);
while(t--){
scanf("%lld", &k);
ll p=sqrt(k*1.0);
a=b=-inf;
if(p*p==k) p+=1;//大于p
for(i=p;;i++){
if(s[i]==0){
a=i*i; break;
}
}
if(p>sqrt(k*1.0)) p-=2;//(前面已经+1,所以-2使之小于p)
for(i=p;i>1;i--){
if(s[i]==0){
b=i*i; break;
}
}
if(a<0)//a没找到
printf("%lld\n", b);
else if(b<0)//b没找到
printf("%lld\n", a);
else{
ll c;
if(abs(a-k)<=abs(b-k))//取距离 k 最小的
c=a;
else
c=b;
printf("%lld\n", c);
}
}
return 0;
}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: