ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P1217 [USACO1.5]回文质数 Prime Palindromes

2022-05-19 21:32:05  阅读:154  来源: 互联网

标签:Prime 10 Palindromes int 质数 include 9999999 回文


P1217 [USACO1.5]回文质数 Prime Palindromes

题目描述

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

写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)[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
超时未通过的第一种代码:
#include <iostream>
#include <cmath>
using namespace std;
bool  Prime(int x)
{
    if(x<=1) return false;
    for(int i=2;i<=sqrt(x);i++)
    {
        if(x%i==0) return false;
    }
    return true; 
}
bool Palindromes(int x)
{
    int n,m;
    m=0;n=x;
    while(n!=0)
    {
        m=m*10+n%10;
        n/=10;
    }
    if(m==x) return true;
    else return false;
}
int main()
{
    int a,b;
    cin>>a>>b;
    for(int i=a;i<=b;i++)
    {
        if(Prime(i)&&Palindromes(i))  cout<<i<<endl;
    }
    return 0;
}
提交结果:

 

 因为第一种代码在a~b中找质数,又在a~b中找回文数,所以循环的次数增加,也就导致了上面的运行结果不通过(不通过是因为超时)。

对于上面的代码,我们可以进行优化:1.质数从a~b里找,回文数在质数里找;2.回文数从a~b里找,质数在回文数里找。

如果在质数里找回文数代码是:

#include <iostream>
#include <cmath>
using namespace std;
bool Palindromes(int x)
{
    int n,m;
    m=0;n=x;
    while(n!=0)
    {
        m=m*10+n%10;
        n/=10;
    }
    if(m==x) return true;
    else return false;
}
bool  Prime(int x)
{
    if(x<=1) return false;
    for(int i=2;i<=sqrt(x);i++)
    {
        if(x%i==0) return false;
    }
    Palindromes(x);
}

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    if(b>=9999999) b=9999999; //最大的回文质数处理
    if(a%2==0)a++;//从2的倍数+1开始搜索
    for(int i=a;i<=b;i++)
    {
        if(Prime(i))
        { 
            if(Palindromes(i)!=0) cout<<i<<endl; 
        } 
    }
    return 0;
}

提交结果:

为什么在质数里找回文数不通过呢?是因为找质数是用for循环1次1次的循环,循环次数就会很多

 而找回文数用while循环次数就会少一些了因为while循环的次数并不是1次1次的循环,所以要从回文数里找质数。

下面是通过的两种代码:

通过的第一种代码:
#include <iostream>
#include <cmath>
using namespace std;
bool Palindromes(int x)
{
    int n,m;
    m=0;n=x;
    while(n!=0)
    {
        m=m*10+n%10;
        n/=10;
    }
    if(m==x) return true;
    else return false;
}
bool  Prime(int x)
{
    if(x<=1) return false;
    for(int i=2;i<=sqrt(x);i++)
    {
        if(x%i==0) return false;
    }
    Palindromes(x);
}

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    if(b>=9999999) b=9999999; //最大的回文质数处理
    if(a%2==0)a++;//从2的倍数+1开始搜索
    for(int i=a;i<=b;i++)
    {
        if(Palindromes(i)==0) continue;
        else if(Prime(i)) cout<<i<<endl; 
    }
    return 0;
}

通过的第二种代码:
#include<bits/stdc++.h>
using namespace std;
int a,b,s[10];
bool prime(int x)//判断质数
{
    int i;
    for(i=3;i<=sqrt(x);i++)
        if(x%i==0) return 0;
    return 1;
}
bool huiwen(int x)//判断回文
{
    int k,len=0,j;
    while(x!=0)
    {
        len++;
        s[len]=x%10;
        x/=10;
    }
    if(len==1) 
    {
        s[len]=0;
        return 1;
    }
    for(k=1;k<=len/2;k++)
            if(s[k]!=s[len-k+1]) return 0;
    for(k=1;k<=len;k++) s[k]=0;
    return 1;
}
int main()
{
    int i;
    cin>>a>>b;
    if(b>=9999999) b=9999999; //最大的回文质数处理
    if(a%2==0)a++;//从2的倍数+1开始搜索
    for(i=a;i<=b;i+=2)//2的倍数不为回文质数
    {
        if(huiwen(i)==0) continue;
        else if(prime(i)) cout<<i<<endl; 
    }
    return 0;
}
以上这两种不同的解法,大家可以自行借鉴。



标签:Prime,10,Palindromes,int,质数,include,9999999,回文
来源: https://www.cnblogs.com/Tiger123/p/16290180.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有