【2050】特殊质数

Time Limit: 1 second
Memory Limit: 2 MB

问题描述

有一个有趣的现象,有些数字(例如:2333)是个质数,将末尾的数去掉后发现它仍然是质数,依此类推,一直到第一位仍是质数。现在给定n和m的值,求在这个范围内所有的这种特殊质数和总个数。 (由于1的特殊性,这种特殊质数不包括小于20的质数,对等于1的情况不单独处理)

    
 

Input

输入只有两行,第一行一个整数n,第二行一个整数m。其中n和m都在一般整数范围内,并>=20,且n<=m不一定成立

Output

输出有多行,每个符合条件的特殊质数占一行,按从小到大的顺序输出,最后一行是总个数。如果在该范围内没有符合条件的数,那么输出一个0,仅一行。

Sample Input

2223
2334

Sample Output

    2333(换行)
    1

【题解】
用一个bool型的函数,判断一下这个数字是否为质数,这个函数可以写成递归的形式,x为质数就再判断一下x/10是否为质数。最后出口是x== 0 ,即去掉所有的最后一位后都是质数。
【代码】
#include <cstdio>
#include <cmath>

int a,b,num = 0;

void input_data()
{
    scanf("%d",&a);
    scanf("%d",&b);
    if (a > b) //有说a 不一定小于b,则要判断一下
        {
            int t = a;a = b;b = t;
        }
}

bool can(int x) //判断x是否为特殊质数的递归写法
{
    if (x == 0) return true; //如果x==0则为出口 返回true
    int m = sqrt(x); //获取根号x
    for (int i = 2;i <= m;i++) //判断这个数字是否为质数的方法
        if ((x % i) == 0)
            return false;
    return can(x / 10); //递归
}

void output_ans()
{
    for (int i = a;i <= b;i++)
        if (can(i))
            {
                num++;
                printf("%d
",i);
            }
    printf("%d",num);
}

int main()
{
    input_data();
    output_ans();
    return 0;
}

原文地址:https://www.cnblogs.com/AWCXV/p/7632459.html