1.打表:
来源洛谷:P1217 回文质数
第一次用打表的方法做题,感觉打开了新世界。
打表法就是将题目中需要的答案集合提前算出来,存到代码里,根据题目所需取答案。
在数据量很大但所给时间比较少的情况下使用效果显著。
详细过程集成在代码注释中:
#include<iostream> //#include<fstream> using namespace std; //const int MAX = 10000000+5; //int num[MAX];//用来存放质数标记 int prinum[780] = {...};//此处省略打表结果 //bool pal(int n); //void prime(); int main() { int a, b; //保存打表打出来的数据,再从文件中复制粘贴数据到prinum数组 /*ofstream file("1.txt"); prime(); for (int i = 5; i < MAX; i+=2) if(pal(i)) if (!num[i]) file << i << ',';*/ //一大堆的判断从打好的表中找数据 scanf("%d%d", &a, &b); for (int i=0;; i++) { if (prinum[i] < a) continue; if (prinum[i] > b) break; if (i>=780) break; if (prinum[i] >= a && prinum[i] <= b) cout << prinum[i] << endl; } return 0; } //普通的判断回文数 /*bool pal(int n) { int t = n; int m=0; while (t) { m = m * 10 + t % 10; t /= 10; } if (m == n) return 1; return 0; }*/ //埃氏法筛选质数,原理是将质数的倍数标记出来,因为他们肯定不是质数 /*void prime() { num[0] = num[1] = 1; for (int i = 2; i < MAX; i++) { if (num[i]) continue; for (int j = i * 2; j < MAX; j += i) num[j] = 1; } }*/
2.选择数的时候可以用不降原则来避免重复选到一样的数
不降原则就是升序选数,每次选数都从上一个选到的数的位置往后选,在DFS中可以使用。
例题:P1036 选数