zoukankan      html  css  js  c++  java
  • P1217 [USACO1.5]回文质数 Prime Palindromes

    题目描述

    因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

    写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;

    输入输出格式

    输入格式:
    第 1 行: 二个整数 a 和 b .

    输出格式:
    输出一个回文质数的列表,一行一个。

    输入输出样例

    输入样例#1: 复制
    5 500
    输出样例#1: 复制
    5
    7
    11
    101
    131
    151
    181
    191
    313
    353
    373
    383
    说明

    Hint 1: Generate the palindromes and see if they are prime.

    提示 1: 找出所有的回文数再判断它们是不是质数(素数).

    Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.

    提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。

    题目翻译来自NOCOW。

    USACO Training Section 1.5

    产生长度为5的回文数:

    for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数

     for (d2 = 0; d2 <= 9; d2++) {
         for (d3 = 0; d3 <= 9; d3++) {
           palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
         }
     }
    

    }

    超时代码

    #include <bits/stdc++.h>
    using namespace std;
    int fun1(int a)
    {
        if(a<=1)
            return 0;
        for(int i=2;i<=sqrt(a);i++)
        {
            if(a%i==0)
                return 0;
        }
        return 1;
    
    }
    int main()
    {
        int a[100000],l=0;//用一个数组把所有符合条件的数存起来;超时
        for(int i=2;i<=9;i++)
        {
            if(fun1(i))
            {
                a[l]=i;
                l++;
            }
    
        }
        //if(a==11)//除11外,偶数位回文数肯定不为素数
        a[l]=11;
        l++;
        //if(a>=100&&a<=999)//三位数
        //{
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    int f=100*d1 + 10*d2 + d1;//(处理回文数...)
                    if(fun1(f))
                    {
                        a[l]=f;
                        l++;
                    }
                }
            }
        //}
        //if(a<=99999&&a>=10000)//五位数
        //{
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        int f=10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
                        if(fun1(f))
                        {
                            a[l]=f;
                            l++;
                        }
                    }
                }
            }
        //}
        //if(a<=9999999&&a>=1000000)//七位数
        //{
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        for (int d4 = 0; d4 <= 9; d4++)
                        {
                            int f=1000000*d1 + 100000*d2 +10000*d3 + 1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
                            if(fun1(f))
                            {
                                a[l]=f;
                                l++;
                            }
                        }
                    }
                }
            }
        //}
        //if(a<=999999999&&a>=100000000)//九位数
        //{
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        for (int d4 = 0; d4 <= 9; d4++)
                        {
                            for (int d5 = 0; d5 <= 9; d5++)
                            {
                                int f=100000000*d1 + 10000000*d2 +1000000*d3 + 100000*d4+10000*d5+1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
                                if(fun1(f))
                                {
                                    a[l]=f;
                                    l++;
                                }
                            }
                        }
                    }
                }
            }
        //}
        //偶数位全为非素数
        int m,n;
        cin>>m>>n;
        for(int s=0; ;s++)
        {
            if(a[s]<=n&&a[s]>=m)
                cout<<a[s]<<endl;
            if(a[s]>n)
                break;
        }
    
        return 0;
    }

    依旧超时

    #include <bits/stdc++.h>
    using namespace std;
    int fun1(int a)
    {
        if(a<=1)
            return 0;
        for(int i=2;i<=sqrt(a);i++)
        {
            if(a%i==0)
                return 0;
        }
        return 1;
    
    }
    int main()
    {//用数组存超时,改成直接输出
        int m,n;
        cin>>m>>n;
        for(int i=2;i<=9;i++)
        {
            if(fun1(i))
            {
                if(i>=m&&i<=n)
                    cout<<i<<endl;
            }
    
        }
        //if(a==11)//除11外,偶数位回文数肯定不为素数
        if(11>=m&&11<=n)
            cout<<11<<endl;
        //if(a>=100&&a<=999)//三位数
        //{
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    int f=100*d1 + 10*d2 + d1;//(处理回文数...)
                    if(fun1(f))
                    {
                        if(f>=m&&f<=n)
                            cout<<f<<endl;
                    }
                }
            }
        //}
        //if(a<=99999&&a>=10000)//五位数
        //{
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        int f=10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
                        if(fun1(f))
                        {
                            if(f>=m&&f<=n)
                            cout<<f<<endl;
                        }
                    }
                }
            }
        //}
        //if(a<=9999999&&a>=1000000)//七位数
        //{
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        for (int d4 = 0; d4 <= 9; d4++)
                        {
                            int f=1000000*d1 + 100000*d2 +10000*d3 + 1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
                            if(fun1(f))
                            {
                                if(f>=m&&f<=n)
                                cout<<f<<endl;
                            }
                        }
                    }
                }
            }
        //}
        //if(a<=999999999&&a>=100000000)//九位数
        //{
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        for (int d4 = 0; d4 <= 9; d4++)
                        {
                            for (int d5 = 0; d5 <= 9; d5++)
                            {
                                int f=100000000*d1 + 10000000*d2 +1000000*d3 + 100000*d4+10000*d5+1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
                                if(fun1(f))
                                {
                                    if(f>=m&&f<=n)
                                    cout<<f<<endl;
                                }
                            }
                        }
                    }
                }
            }
        //}
        //偶数位全为非素数
    
    
        return 0;
    }

    88分的超时代码

    #include <bits/stdc++.h>
    using namespace std;
    int fun1(int a)
    {
        if(a<=1)
            return 0;
        for(int i=2;i<=sqrt(a);i++)
        {
            if(a%i==0)
                return 0;
        }
        return 1;
    
    }
    int main()
    {//用数组存超时,改成直接输出
        int m,n;
        cin>>m>>n;
        for(int i=2;i<=9;i++)
        {
            if(fun1(i))
            {
                if(i>=m&&i<=n)
                    cout<<i<<endl;
            }
    
        }
        //if(a==11)//除11外,偶数位回文数肯定不为素数
        if(11>=m&&11<=n)
            cout<<11<<endl;
        //if(a>=100&&a<=999)//三位数
        //{
        if(m<=999&&n>=100)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    int f=100*d1 + 10*d2 + d1;//(处理回文数...)
                    if(fun1(f))
                    {
                        if(f>=m&&f<=n)
                            cout<<f<<endl;
                    }
                }
            }
        //}
        //if(a<=99999&&a>=10000)//五位数
        //{
        if(m<=99999&&n>=10000)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        int f=10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
                        if(fun1(f))
                        {
                            if(f>=m&&f<=n)
                            cout<<f<<endl;
                        }
                    }
                }
            }
        //}
        //if(a<=9999999&&a>=1000000)//七位数
        //{
        if(m<=9999999&&n>=1000000)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        for (int d4 = 0; d4 <= 9; d4++)
                        {
                            int f=1000000*d1 + 100000*d2 +10000*d3 + 1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
                            if(fun1(f))
                            {
                                if(f>=m&&f<=n)
                                cout<<f<<endl;
                            }
                        }
                    }
                }
            }
        //}
        //if(a<=999999999&&a>=100000000)//九位数
        //{
        if(m<=999999999&&n>=100000000)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        for (int d4 = 0; d4 <= 9; d4++)
                        {
                            for (int d5 = 0; d5 <= 9; d5++)
                            {
                                int f=100000000*d1 + 10000000*d2 +1000000*d3 + 100000*d4+10000*d5+1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
                                if(fun1(f))
                                {
                                    if(f>=m&&f<=n)
                                    cout<<f<<endl;
                                }
                            }
                        }
                    }
                }
            }
        //}
        //偶数位全为非素数
    
    
        return 0;
    }
    

    终于过了

    #include <bits/stdc++.h>
    using namespace std;
    int fun1(int a)
    {
        if(a<=1)
            return 0;
        for(int i=2;i<=sqrt(a);i++)
        {
            if(a%i==0)
                return 0;
        }
        return 1;
    
    }
    int main()
    {//用数组存超时,改成直接输出
        int m,n;
        cin>>m>>n;
        for(int i=2;i<=9;i++)
        {
            if(fun1(i))
            {
                if(i>=m&&i<=n)
                    cout<<i<<endl;
            }
    
        }
        //if(a==11)//除11外,偶数位回文数肯定不为素数
        if(11>=m&&11<=n)
            cout<<11<<endl;
        //if(a>=100&&a<=999)//三位数
        //{
        if(m<=999&&n>=100)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    int f=100*d1 + 10*d2 + d1;//(处理回文数...)
                    if(fun1(f))
                    {
                        if(f>=m&&f<=n)
                            cout<<f<<endl;
                    }
                }
            }
        //}
        //if(a<=99999&&a>=10000)//五位数
        //{
        if(m<=99999&&n>=10000)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        int f=10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
                        if(fun1(f))
                        {
                            if(f>=m&&f<=n)
                            cout<<f<<endl;
                        }
                    }
                }
            }
        //}
        //if(a<=9999999&&a>=1000000)//七位数
        //{
        if(m<=9999999&&n>=1000000)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        for (int d4 = 0; d4 <= 9; d4++)
                        {
                            int f=1000000*d1 + 100000*d2 +10000*d3 + 1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
                            if(fun1(f))
                            {
                                if(f>=m&&f<=n)
                                cout<<f<<endl;
                            }
                        }
                    }
                }
            }
        //}
        //if(a<=999999999&&a>=100000000)//九位数  九位数不存在回文质数
        //{
        /*if(m<=999999999&&n>=100000000)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   // 只有奇数才会是素数
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        for (int d4 = 0; d4 <= 9; d4++)
                        {
                            for (int d5 = 0; d5 <= 9; d5++)
                            {
                                int f=100000000*d1 + 10000000*d2 +1000000*d3 + 100000*d4+10000*d5+1000*d4+100*d3+10*d2 + d1;//(处理回文数...)
                                if(fun1(f))
                                {
                                    if(f>=m&&f<=n)
                                    cout<<f<<endl;
                                }
                            }
                        }
                    }
                }
            }*/
        //}
        //偶数位全为非素数
    
    
        return 0;
    }
    

    正解

    #include <bits/stdc++.h>
    using namespace std;
    int fun1(int a)
    {
        if(a<=1)
            return 0;
        for(int i=2;i<=sqrt(a);i++)
        {
            if(a%i==0)
                return 0;
        }
        return 1;
    
    }
    int main()
    {
        int m,n;
        cin>>m>>n;
        for(int i=2;i<=9;i++)
        {
            if(fun1(i))
            {
                if(i>=m&&i<=n)
                    cout<<i<<endl;
            }
    
        }
    
        if(11>=m&&11<=n)
            cout<<11<<endl;
    
        if(m<=999&&n>=100)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    int f=100*d1 + 10*d2 + d1;
                    if(fun1(f))
                    {
                        if(f>=m&&f<=n)
                            cout<<f<<endl;
                    }
                }
            }
    
        if(m<=99999&&n>=10000)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        int f=10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;
                        if(fun1(f))
                        {
                            if(f>=m&&f<=n)
                            cout<<f<<endl;
                        }
                    }
                }
            }
    
        if(m<=9999999&&n>=1000000)
            for (int d1 = 1; d1 <= 9; d1+=2)
            {   
                for (int d2 = 0; d2 <= 9; d2++)
                {
                    for (int d3 = 0; d3 <= 9; d3++)
                    {
                        for (int d4 = 0; d4 <= 9; d4++)
                        {
                            int f=1000000*d1 + 100000*d2 +10000*d3 + 1000*d4+100*d3+10*d2 + d1;
                            if(fun1(f))
                            {
                                if(f>=m&&f<=n)
                                cout<<f<<endl;
                            }
                        }
                    }
                }
            }
        return 0;
    }
    
  • 相关阅读:
    《解密腾讯海量服务之道》讲座笔记
    图解 Paxos 一致性协议
    向量时钟算法简介——本质类似MVCC
    logback配置
    Protocol Buffers简明教程
    分布式调用技术 RPC VS REST
    Dubbo和Spring Cloud微服务架构对比
    Spring Boot学习笔记
    relatedTarget、fromElement、toElement相关元素
    12个不可不知的Sublime Text应用技巧和诀窍
  • 原文地址:https://www.cnblogs.com/ZCWang/p/12507499.html
Copyright © 2011-2022 走看看