POJ 2689 区间素数
2016-03-30 21:56
465 查看
#include <cstdio> #include <cstring> const int maxn = 1E6 + 10; int prime[maxn], primeLR[maxn], A, B; bool vis[maxn]; void GetPrime() { memset(prime, 0, sizeof(prime)); for (int i = 2; i <= maxn; i++) { if (!prime[i]) prime[++prime[0]] = i; for (int j = 1; j <= prime[0] && prime[j] <= maxn / i; j++) { prime[prime[j]*i] = 1; if (i % prime[j] == 0) break; } } } void GetPrimeLR(int L, int R) { memset(vis, 0, sizeof(vis)); if (L < 2) L = 2; for (int i = 1; i <= prime[0] && (long long)prime[i]*prime[i] <= R; i++) { int s = L / prime[i] + (L % prime[i] > 0); if (s == 1) s = 2; for (int j = s; (long long)j * prime[i] <= R; j++) if ((long long)j * prime[i] >= L) vis[j * prime[i] - L] = 1; } primeLR[0] = 0; for (int i = 0; i <= R - L; i++) if (!vis[i]) primeLR[++primeLR[0]] = i + L; } int main(int argc, char const *argv[]) { GetPrime(); while (~scanf("%d%d", &A, &B) && A + B) { GetPrimeLR(A, B); if (primeLR[0] < 2) printf("There are no adjacent primes.\n"); else { int x1 = 0, x2 = 1E8, y1 = 0, y2 = 0; for (int i = 1; i < primeLR[0]; i++) { if (primeLR[i + 1] - primeLR[i] < x2 - x1) x1 = primeLR[i], x2 = primeLR[i + 1]; if (primeLR[i + 1] - primeLR[i] > y2 - y1) y1 = primeLR[i], y2 = primeLR[i + 1]; } printf("%d,%d are closest, %d,%d are most distant.\n", x1, x2, y1, y2); } } return 0; }
给出一个区间[L,U],区间内相邻的距离最近的两个素数和距离最远的两个素数。
套用区间素数模板,暴力寻找。
相关文章推荐
- Android 使用外部已经建立好的sqlite数据库
- bash特性
- Shell - 11
- ViewController/生命周期
- 【MVC 4】5.SportsSore —— 一个真实的应用程序
- mysql更改表结构:添加、删除、修改字段、调整字段顺序
- 软件工程---单元测试报告
- Linux内核分析作业第六周
- 认识与学习bash
- HDU 3549 Flow Problem【最大流】
- spring security 处理session 超时跳转到登录页面
- miniTwitter登录界面的实现
- app性能优化之如何计算apk的启动时间
- C数组
- Linux学习笔记——重点推荐的Linux网络在线学习资源
- Array、List、Set、与Map
- UVa-10817 Headmaster's Headache (位运算)
- POJ 2299 Ultra-QuickSort(树状数组+离散化—求逆序数)
- 转为python
- DDL、DML和DCL的理解