求助,用了欧拉筛后最后一个测试点还是TLE
查看原帖
求助,用了欧拉筛后最后一个测试点还是TLE
200525
cks_楼主2023/7/28 23:11
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

bool flag[100000001]; // 标记素数
int prime[100000001]; // 缓存素数

void EulerSieve(int n) // 欧拉筛选法,时间复杂度O(n)
{
    for (int i = 2; i <= n; i++)
    {
        if (flag[i])
            prime[++prime[0]] = i;
        for (int j = 1; i * prime[j] <= n && j <= prime[0]; j++)
        {
            flag[i * prime[j]] = false;
            if (i % prime[j] == 0)
                break;
        }
    }
}

int isPN(int n) // 判断是否是回文数(Palindrome Number),时间复杂度O(n)
{
    if (n < 0 || (n % 10 == 0 && n != 0))
    {
        return 0;
    }
    int s = n, y = 0;
    while (s > 0)
    {
        y = y * 10 + s % 10;
        s = s / 10;
    }
    return n == y ? 1 : 0;
}

int main()
{
    int a, b;
    memset(flag, true, sizeof(flag));
    flag[1] = 0;
    scanf("%d %d", &a, &b);
    EulerSieve(b);
    if (a % 2 == 0)
        a++;
    for (int i = a; i <= b; i += 2)
    {
        if (isPN(i) && flag[i])
        {
            printf("%d\n", i);
        }
    }
    return 0;
}

甚至比传统求素数方法(循环里开根号那个)还慢了0.5秒....

2023/7/28 23:11
加载中...