Prime Palindromes(USACO Gateway)的判定

题目英文描述:

The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 1000,000,000); both a and b are considered to be within the range .

Input

Line 1: Two integers, a and b

Output

The list of palindromic primes in numerical order, one per line.

sample input :

5 500

sample output:

5

7

11

101

131

151

181

191

313

353

373

383


刚开始的思路:

就是想着写个素数判定函数、回数判定函数,同时满足条件即可~可是提交上去,没有AC,而是显示超时了。

#include <stdio.h>
#include <math.h>


int Prime(int n)
{
    int i;
    double k;
    k=sqrt(n);
    for(i=2;i<=k;i++)
    {
        if (n%i==0)
        {
            return 0;
        }
    }
    return 1;
}




int Palindromes(int num)
{
    int sum = 0;
    //关键代码
    int temp = num;
    while(temp)
    {
        sum = sum*10 + temp%10;
        temp /= 10;
    }
    if (sum == num)
    return 1;
    else
    return 0;
}
int main()
{
    int num1= 0 ,num2 = 0;
    while(scanf("%d %d",&num1,&num2)!=EOF)
    {
        int i = num1;
        for(;i<=num2;i++)
        {
            if(Palindromes(i))
            {
                if(Prime(i))
                printf("%d\n",i);
            }


        }
    }
    return 0;
}





之后在网上找资料,才发现,可以利用回数的规律对回数的判定进行优化的。以下是基于回数判定的优化~已经AC;

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int Prime(int n)
{
    int i;
    double k;
    k=sqrt(n);
    for(i=2;i<=k;i++)
    {
        if (n%i==0)
        {
            return 0;
        }
    }
    return 1;
}

int main()
{
    int a,b,c,d,e,f,g,y;
    scanf("%d %d",&f,&g);
    for (a=5;a<=7;a++)
    {
        if (Prime(a)==1&&a>=f&&a<=g)
        {
            printf("%d\n",a);
        }
    }
    for (a=1;a<=9;a+=2)
    {
        y=11*a;
        if(Prime(y)==1&&y>=f&&y<=g)
            printf("%d\n",y);
    }
    for (a=1;a<=9;a+=2)
    {
        for(b=0;b<=9;b++)
        {
            y=a*101+10*b;
            if(Prime(y)==1&&y>=f&&y<=g)
                printf("%d\n",y);
        }
    }
    for (a=1;a<=9;a+=2)
    {
        for(b=0;b<=9;b++)
        {
            for (c=0;c<=9;c++)
            {
                y=10001*a+1010*b+100*c;
                if (Prime(y)==1&&y>=f&&y<=g)
                    printf("%d\n",y);
            }
        }
    }
    for (a=1;a<=9;a+=2)
    {
        for (b=0;b<=9;b++)
        {
            for (c=0;c<=9;c++)
            {
                for (d=0;d<=9;d++)
                {
                    y=1000001*a+100010*b+10100*c+1000*d;
                    if (Prime(y)==1&&y>=f&&y<=g)
                        printf("%d\n",y);
                }
            }
        }
    }
    for (a=1;a<=9;a+=2)
    {
        for (b=0;b<=9;b++)
        {
            for (c=0;c<=9;c++)
            {
                for (d=0;d<=9;d++)
                {
                    for (e=0;e<=9;e++)
                    {
                        y=100000001*a+10000010*b+1000100*c+101000*d+10000*e;
                        if (Prime(y)==1&&y>=f&&y<=g)
                            printf("%d\n",y);
                    }
                }
            }
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值