暑假训练Day2

1.打表:

来源洛谷:P1217 回文质数

第一次用打表的方法做题,感觉打开了新世界。

打表法就是将题目中需要的答案集合提前算出来,存到代码里,根据题目所需取答案。

在数据量很大但所给时间比较少的情况下使用效果显著。

详细过程集成在代码注释中:

#include
//#include
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 选数

你可能感兴趣的:(暑假训练Day2)