东大OJ-5到100000000之间的回文质数
1217: VIJOS-P1042
时间限制: 0 Sec 内存限制: 128 MB
提交: 78 解决: 29
[提交][状态][讨论版]
题目描述
输入
输出
样例输入
100 500
样例输出
101 131 151 181 191 313 353 373 383
#include<stdio.h>
#include<string.h>
int prime[4000];
int psize;
int from, to;
void getPrime(){memset(prime, 0, sizeof(prime));psize = 0;int i,j;bool a[10000];memset(a, -1, sizeof(a));for (i = 2; i < 10000; i++){if (!a[i])continue;prime[psize++] = i;for (j = i + i; j < 10000; j+=i)a[j] = false;}
}
bool isPrime(int n){int i;for (i = 0;prime[i]*prime[i]<=n; i++)if (n%prime[i] == 0)return false;return true;
}
void one(){if (from>7)return;if (from == 5)printf("5\n");printf("7\n");
}
void three(){if (from > 999)return;int i, j,k;int a[4] = { 1, 3, 7, 9 };for (i = 0; i < 4;i++)for (j = 0; j < 10; j++){k = a[i] * 100 + j * 10 + a[i];if ( k< from)continue;if (k>to)return;if (isPrime(k))printf("%d%d%d\n", a[i], j,a[ i]);}
}
void five(){if (from>99999)return;int a[4] = { 1, 3, 7, 9 };int i, j, k, l;for (i = 0; i < 4;i++)for (j = 0; j < 10;j++)for (k = 0; k < 10; k++){l = a[i] * 10000 + j * 1000 + k * 100 + j * 10 + a[i];if (l<from)continue;if (l>to)return;if (isPrime(l))printf("%d%d%d%d%d\n", a[i], j, k, j, a[i] );}
}
void seven(){if (from>9999999)return;int a[4] = { 1, 3, 7, 9 };int i, j, k, l,m;for (i = 0; i < 4; i++)for (j = 0; j < 10; j++)for (k = 0; k < 10; k++)for(m=0;m<10;m++){l = a[i] * 1000000 + j * 100000 + k * 10000 + m * 1000 +k*100+j*10+ a[i];if (l<from)continue;if (l>to)return;if (isPrime(l))printf("%d%d%d%d%d%d%d\n", a[i], j, k,m,k, j, a[i]);}
}
int main(){getPrime();prime[psize++]=10001;scanf("%d%d", &from, &to);one();if (11 >= from && 11 <= to)printf("11\n");three(); five(); seven();return 0;
}
上面这个5ms
再慢一点的算法:6311ms
#include<stdio.h>
#include<string.h>
#include<math.h>
int prime[4000];
int psize;
int from, to;
void getPrime(){memset(prime, 0, sizeof(prime));psize = 0;int i,j;bool a[10000];memset(a, -1, sizeof(a));for (i = 2; i < 10000; i++){if (!a[i])continue;prime[psize++] = i;for (j = i + i; j < 10000; j+=i)a[j] = false;}
}
bool isPrime(int n){int i;for (i = 0;prime[i]*prime[i]<=n; i++)if (n%prime[i] == 0)return false;return true;
}
bool isHuiwen(int n,int wei){if (wei == 0||wei==1)return true;int i;if (n /(int) pow((double)10, wei-1) == n % 10){n %= (int)pow((double)10, wei-1);n /= 10;if (isHuiwen(n, wei - 2))return true;}return false;
}
int main(){getPrime();prime[psize++]=10001;scanf("%d%d", &from, &to);if (from == 5)printf("5\n");if (from <= 7 && to >= 7)printf("7\n");if (11 >= from && 11 <= to)printf("11\n");if (from < 100)from = 101;for (; from <= to; from++){int wei = log10((double)from)+1;if (wei % 2 == 0){from = pow((double)10, wei);wei++;if (from>to)break;}if (isPrime(from) && isHuiwen(from,wei))printf("%d\n", from);}return 0;
}
最慢42805ms
#include<stdio.h>
#include<string.h>
#include<math.h>
int prime[4000];
int psize;
int from, to;
void getPrime(){memset(prime, 0, sizeof(prime));psize = 0;int i,j;bool a[10000];memset(a, -1, sizeof(a));for (i = 2; i < 10000; i++){if (!a[i])continue;prime[psize++] = i;for (j = i + i; j < 10000; j+=i)a[j] = false;}
}
bool isPrime(int n){int i;for (i = 0;prime[i]*prime[i]<=n; i++)if (n%prime[i] == 0)return false;return true;
}
bool isHuiwen(int n,int wei){if (wei == 0||wei==1)return true;int i;if (n /(int) pow((double)10, wei-1) == n % 10){n %= (int)pow((double)10, wei-1);n /= 10;if (isHuiwen(n, wei - 2))return true;}return false;
}
int main(){getPrime();prime[psize++]=10001;scanf("%d%d", &from, &to);if (from == 5)printf("5\n");if (from <= 7 && to >= 7)printf("7\n");if (11 >= from && 11 <= to)printf("11\n");if (from < 100)from = 101;for (; from <= to; from++){if (isPrime(from) && isHuiwen(from,log10((double)from)+1))printf("%d\n", from);}return 0;
}
转载于:https://www.cnblogs.com/weiyinfu/p/5013898.html
东大OJ-5到100000000之间的回文质数相关推荐
- P1217 回文质数(打表)
2020.2.9更新,修改打表程序,用上freopen("Table.txt", "w", stdout);程序更加简洁 题目描述 因为151既是一个质数又是一 ...
- P1217 [USACO1.5]回文质数 Prime Palindromes——回文质数性质、打表
[USACO1.5]回文质数 Prime Palindromes 题目描述 因为 151151151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151151151 是回文质数. ...
- I00010 打印1到输入数之间的回文数
对于一个数,要判定它是否是回文数,直观的做法是先判定其最高位(首位)与最低位(最后一位)是否相同,如果不同则不是回文数:如果相同则其掉其做高位和最低位,对剩余的位继续进行判定:如果剩余的位只有一位或零 ...
- P1217 [USACO1.5]回文质数 Prime Palindromes
暴力输出5~1e8的回文质数 #include <bits/stdc++.h> using namespace std; int cnt; bool isprim(int x) //10^ ...
- luogu 题解 P1217 【[USACO1.5]回文质数 Prime Palindromes】
题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围 [a,b] (5 < a < b 100,000,00 ...
- 洛谷P1217 [USACO1.5]回文质数 Prime Palindromes
我就叫大家打表吧,自己也刚学会: 由于有些题目直接提交又会超时,所以打表是一个不错的解决方法. 对于回文质数而言,判断回文,判断质数就ok了 1.存入文件 #include<bits/stdc+ ...
- 1亿以内素数的个数_1亿以内的回文质数
今天下午看到这么一个题 找出 1 亿以内的回文质数 很自然的思路就是素数筛,然后验证回文性质 #include #include #include #define TOTAL 100000000 us ...
- 洛谷 - P1217 [USACO1.5]回文质数 Prime Palindromes(欧拉线性筛+数论小知识)
题目链接:点击查看 题目大意:给出一个a和b,求出区间[a,b]中所有回文质数,回文质数指的是一个数既是回文数也是质数 题目分析:首先质数好判断,我们只需要用欧拉筛预处理打好表即可,判断回文数我们也只 ...
- 洛谷P1217 回文质数
题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000 ...
最新文章
- mysql的介绍;安装及基本配置;mysql数据库运行必备技能
- nemanja AJAX,通过AJAX发送空值 - ASP.NET MVC
- I.MX6ULL镜像文件
- boost::hana::for_each用法的测试程序
- 无法将文件ftp服务器上,ftp服务器上传不了文件
- 非proguard无法发现jar(已编译)的外部引用错误,(javac + proguard 则会检查)
- 字符设备驱动高级篇4——设备类(自动创建和删除设备文件)相关代码分析
- python找出有向图的所有环,Python:有向图中的所有简单路径
- Git如何忽略已经上传的文件或文件夹?
- ArcGIS锁定显示比例
- 小程序的发布并发布为Android App流程
- msdtc与oracle,如何解决在Win2003的Oracle链接服务器上MSDTC事务失败问题
- 离散数学第一章 命题逻辑
- 微信小程序ios地图标记点无法点击第二次 markertap
- linux开机启动界面异常,Linux 界面不能启动的解决
- Chrome(谷歌浏览器) 程序开发32个经常使用插件
- kermit的安装与使用
- 考早了!华为认证推出“一试双证”,IE直接补贴3000元
- 最高级微型计算机,「简讯」曜越发布CPU、内存一体式水冷;realme X50t曝光……...
- 初阶指针(纯干货!!!)