zoukankan      html  css  js  c++  java
  • 素数回文(dfs,有bug)

    素数回文

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16487    Accepted Submission(s): 3677

    Problem Description
    xiaoou33对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100,000,000);
     
    Input
    这里有许多组数据,每组包括两组数据a跟b。
     
    Output
    对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。
     
    Sample Input
    5 500
     
    Sample Output
    5 7 11 101 131 151 181 191 313 353 373 383
     

    题解:好bug啊,题目上说包括a,b的,我怎么说一直wa,原来是因为我读清题了。。。我特判了b反到wa了。。。给一组5,7;题意应该是5,7;ac的确是5。。。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    const int MAXN = 100010;
    int dp[MAXN];
    int tp;
    bool is_prime(int x){
        for(int i = 2; i <= sqrt(x); i++){
            if(x % i == 0)return false;
        }
        return true;
    }
    void getx(int temp, int &x, int &y){
        int cur = 0,cnt = 0, cur1 = 0;
        x = temp, y = temp;
        while(temp){
            if(cnt)cur1 = cur1 * 10 + temp % 10, y *= 10;
            cur = cur * 10 + temp % 10;
            temp /= 10;
            x *= 10;
            cnt++;
        }
        x += cur;
        y += cur1;
    }
    void dfs(int cur, int cnt){
        if(cnt >= 5)return;
        int x, y;
        getx(cur, x, y);
    //    printf("%d %d
    ",x,y);
        if(is_prime(x))
            dp[tp++] = x;
        if(is_prime(y))
            dp[tp++] = y;
        for(int i = 0; i <= 9; i++){
            dfs(cur * 10 + i, cnt + 1);
        }
    }
    int main(){
        dp[0] = 2;
        dp[1] = 3;
        dp[2] = 5;
        dp[3] = 7;
        tp = 4;
        dfs(1,1);
        dfs(3,1);
        dfs(7,1);
        dfs(9,1);
        sort(dp,dp + tp);
        int k = unique(dp,dp + tp) - dp;
        int a,b,x,y;
        //cout << dp[k] << " " << dp[k + 1] << endl;
        while(~scanf("%d%d",&a,&b)){
            x = lower_bound(dp, dp + k, a) - dp;
            y = lower_bound(dp, dp + k, b) - dp;
            //if(dp[y] > b)
            //    y--;
            for(int i = x; i < y; i++){
                printf("%d
    ",dp[i]);
            }
            puts("");
        }
        return 0;
    }
  • 相关阅读:
    新代(Syntec)机床的IP设置
    使用任务计划程序实现用户未登录情况下的程序开机自启动
    sql server 数据库访问端口配置
    Http请求
    EF
    SQL Server常用处理
    利用ZXing生成条码二维码例子
    SQL JOIN常见情况
    C#ORM框架收集
    sql server连接oracle并实现增删改查
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5355674.html
Copyright © 2011-2022 走看看