• UVA 10533


    题意

    求a~b内有多少个数满足本身是素数且各位相加后的结果也是素数

    思路

    1 不 是 素 数

    因为这个debug了两个小时WA了四次也很可以
    用普通素数筛就能做, 优化一下用Eratosthenes筛法也行
    先说用普通素数筛:
    只需要先筛选出1-54内的素数( 最大的各位相加是999999这个数 最大54 ) 然后对1~1000000所有数字求出各位相加的结果, 如果各位相加得到的是素数, 再判其本身是否是素数, 做前缀和就可以
    用埃式筛法的话就直接判1~1000000内所有素数存一下, 做前缀和

    AC代码

    普通素数筛

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<cmath>
    using namespace std;
    const int maxn = 1000000+5;
    set<int> pr;
    int pre[maxn];
    
    void primer()
    {
        bool flag;
        for( int i = 2; i < 60; i++ )
        {
            flag = 1;
            for( int j = 2; j*j <= i; j++ )
            {
                if( i % j == 0 )
                {
                    flag = 0;
                    break;
                }
            }
            if(flag) pr.insert(i);
        }
    }
    
    bool isprimer(int num)
    {
        if(num==1) return false;
        for( int i = 2; i*i <= num; i++ )
        {
            if( num % i == 0 )
                return false;
        }
        return true;
    }
    
    int main()
    {
        primer();
        int dig, num;
        pre[0] = 0;
        for( int i = 1; i <= 1000000; i++ )
        {
            dig = i, num = 0;
            while(dig)
            {
                num += dig % 10;
                dig /= 10;
            }
            if( pr.count(num) )
            {
                if( isprimer(i) )
                    pre[i] = pre[i-1] + 1;
                else
                    pre[i] = pre[i-1];
            }
            else pre[i] = pre[i-1];
        }
        int n, a, b;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d%d",&a,&b);
            if( a > b ) swap(a, b);
            printf("%d
    ", pre[b]-pre[a-1]);
        }
        return 0;
    }

    埃式筛法

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<cmath>
    using namespace std;
    const int maxn = 1000000+5;
    bool ok[maxn];
    int pre[maxn];
    
    int main()
    {
        int dig, num;
        ok[0] = 0, ok[1] = 1;
        for( int i = 2; i <= 1000000; i++ )
        {
            if( !ok[i] )
            {
                dig = i, num = 0;
                while(dig)
                {
                    num += dig % 10;
                    dig /= 10;
                }
                if( !ok[num] )
                {
                    pre[i] = 1;
                }
                for(int j = 2*i; j <= 1000000; j += i)
                    ok[j] = 1;
            }
        }
        for(int i = 1; i <= 1000000; i++)
            pre[i] += pre[i-1];
        int n, a, b;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d%d",&a,&b);
            if( a > b ) swap(a, b);
            printf("%d
    ", pre[b]-pre[a-1]);
        }
        return 0;
    }
  • 相关阅读:
    hdu 1247 Hat’s Words (字典树)
    测试
    hdu 1285 确定比赛名次 (拓扑)
    hdu 3172 Virtual Friends (并查集)
    hdu 3635 Dragon Balls (并查集)
    [Shell学习笔记] read命令从键盘或文件中获取标准输入(转载)
    Shell脚本下条件测试(eq.ne.....)(转载)
    每天一个 linux命令(35):ln 命令(转载)
    ubuntu中 python升级 (转载)
    source命令用法(转载)
  • 原文地址:https://www.cnblogs.com/JinxiSui/p/9740531.html
Copyright © 2020-2023  润新知