打表法
对于容易超时,规模小且答案固定(相对固定,结合例题理解)的问题,可以采用打表法,打表法具有快速、易行(可以写暴力枚举的程序)的特点
上题:
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b] (5 <= a < b <= 100,000,000)a,b( 一亿)间的所有回文质数。
上代码:
-
写程序将所有5到100,000,000的回文质数找出来,存到文件里
#include<iostream> #include<string> #include<cstdio> #include<fstream> using namespace std; typedef long long LL; char t[10]; bool isprime(LL x) { for (LL i = 2; i*i <= x; i++) if (!(x%i)) return false; return true; } bool ispalindrome(LL x) { string ch; sprintf(t, "%lld", x); ch = t; int len = ch.length(); for (int i = 0, j = len - 1; i <= j; i++, j--) if (ch[i] != ch[j]) return false; return true; } bool ws(int k) //位数 { if ((k >= 10 && k < 100 && k != 11) || k >= 1000 && k < 10000)return false; if (k >= 100000 && k < 1000000 || k >= 10000000 && k <= 100000000)return false; return true; } int main() { ofstream file("ans.txt"); for (LL i = 5; i <= 100000000; i += 2) if (ws(i)) if (isprime(i) && ispalindrome(i)) file<<i<<","; return 0; }
-
提交的代码
#include<iostream> #include<string> #include<cstdio> using namespace std; typedef long long LL; int lst[5960] = { }; //数太多,就不放进去了QAQ int a, b; int main() { cin >> a >> b; for (int i = 0;; i++) { if (i > 5960) break; if (lst[i] >= a && lst[i] <= b) cout << lst[i] << endl; if (lst[i] < a) continue; if (lst[i] > b) break; } return 0; }