东大OJ-5到100000000之间的回文质数
2014-08-01 15:39
169 查看
1217: VIJOS-P1042
时间限制: 0 Sec 内存限制: 128 MB提交: 78 解决: 29[提交][状态][讨论版]题目描述
有一天,雄霸传授本人风神腿法第一式:捕风捉影..............的步法(弟子一:堂主,你大喘气呀。风:你给我闭嘴。)捕风捉影的关键是换气(换不好就会大喘气...)。 使用捕风捉影这一招时并不是每一步都喘气,而是在特定的步数喘气。一般来说功力越高,喘气越稀疏。喘气的步数符合特定规律:第一要是SUSHU(弟子二:哇塞!堂主,你还会鸟语,我好好崇拜你呦!可是SUSHU是什么意思呢?风:笨蛋,那是汉语拼音!)第二要是一个回文数,回文数就是正反念一样的数,如:123321,121,5211314(弟子三:堂主,最后一个好象不是...风:废话,当然不是了,我是考察一下你们的纠错能力!)现在给出两个数M,N(5<=M< N< =100,000,000),你要算出M,N之间需要换气的都有哪几步。(包括M,N)。算出来的可以提升为本堂一级弟子,月薪(1000000000000000000000000000000000000000000 MOD 10 )元。输入
两个整数M,N。用空格隔开。输出
在M,N之间的换气点,每个一行。样例输入
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;}
相关文章推荐
- 东大OJ-5到100000000之间的回文质数
- 东大OJ-5到100000000之间的回文质数
- 用java实现找出1-100之间的质数(两种方法)
- 输出1-100之间的质数
- 质数 素数 合数 闰年 回文
- 找出输入区间内的回文质数
- 2. 编写一个Java应用程序,用户从键盘输入一个1~9999之间的数,程序将判断这个数是几位数,并判断这个数是否是回文数。回文数是指将该数含有的数字逆序排列后得到的数和原数相同,例如12121、32
- 习题:输出1-100之间的所有质数(素数)
- 用python求1到n之间的质数
- c编程:用户输入一个数值n,打印出出1到n之间的所有质数
- 素数回文——输出两整数之间所有既是回文数又是素数的数 C++实现
- USACO-Section1.5 Prime Palindromes [回文数][质数]
- java中请给出例子程序:找出n到m之间的质数。
- C语言求解素数(质数)的优化:打印100-200之间的素数
- 求1到自然数m之间的素数(质数),并打印出来
- C#l练习(用方法来实现:①判断一个给定的整数是否为“质数”。②计算1-100之间的所有质数(素数)的和
- 回文质数
- 输出1-10000之间的质数
- JAVA之输出2~100之间的质数
- 打印100-999之间的回文数