质方数
2016-03-18 00:21
176 查看
质方数
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)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
解题思路:打表标记非素数,即i*j的都不为素数,然后将遍历数组非标记的即为素数,进行平方放入数组,即为质方数,最后寻找比n第一个大的质方数,然后再用n的前一个质方数,这俩个数分别与n算差值,取小的即为最接近
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int a[10009],record[2000],num; void primeSquare() { int i,j; for(i=2;i<5001;i++)//i<5001是因为最大限制是10^4,而2*5000 = 10000,所以5001 { for(j=2;i*j<10009;j++)//为了避免数据的遗漏,将>10^4的第一素数为10007 { a[i*j] = 1;//标记1为不是素数,因为i*j这个数的因子最少为i和j,所以它肯定不是素数 } } for(i=2;i<10009;i++) { if(a[i] == 0)//没有就标记的即为素数 { record[num++] = i*i;//计算质方数 } } } int main() { primeSquare(); int t,n,i; scanf("%d",&t); while(t--) { scanf("%d",&n); if(n <= 4) { printf("4\n"); continue; } for(i=0;i<num;i++) { if(n < record[i])//找到第一个比n大的质方数 { break; } } //i = lower_bound(record,record+num,n) - reocrd;//STL查找函数 if(n - record[i-1] > record[i] - n)//判断n的前一个质方数和后一个哪个差值小,即输出哪个质方数 printf("%d\n",record[i]); else printf("%d\n",record[i-1]); } return 0; }
相关文章推荐
- 堆和栈区别
- 读取并修改元素的内容:选中项左右移动
- QT断点续传(原理:需要在HTTP请求的header中添加Rang节,告诉服务器从文件的那个位置开始传输.格式为bytes 开始传输的位置)
- HDU-2829 Lawrence (DP+四边形不等式优化)
- [BZOJ3404][Usaco2009 Open]Cow Digit Game又见数字游戏
- 转载的一篇php代码的执行流程
- Objective-C中谓词(NSPredicate)的应用
- Object对象之equals方法
- QT插件开发方式(没看懂)
- java 时间戳与日期字符串相互转换
- git for mac
- 通过EPROCESS获取进程名
- Qt调用WebService
- keystone v2 to v3
- Linux文件编程总结
- Android界面实现
- 切木棍问题(深搜)
- 别老扯什么Hadoop了,你的数据根本不够大
- android山寨卫士开发笔记-002
- QT实现不规则窗体