题目描述
Alice非常喜欢素数,她发现有些素数非常有意思。比如239,它是个素数;把239的最后一位去掉是23,也是个素数;把23的最后一位去掉是2,也是个素数。但是Alice不太善于计算,她请你帮她计算出所有满足这样条件的素数。
输入
无
输出
按素数大小依次输出,每行先输出序号,然后输出符合条件的素数,中间用空格隔开。
样例输入
样例输出
1 2 2 3 3 5 4 7 5 23 ...线索
这样的素数只有83个,且不会超过32位int的表示范围。
解题思路: 逆着来,题目要求 依次去掉最后一位数,而 int 范围内,数量这么多,如果正向计算,逐个验证,无疑是会非常麻烦。所以我们要反着来,先从低位开始找,先找到低位是素数的数,然后增加一位数位,依次往上找。
AC代码:
#include <stdio.h>
#include <stdlib.h>
int cnt;
int prime[100];
int cmp(const void* p1, const void* p2){
return *(int *)p1 - *(int *)p2;
}
bool is_prime(int p)
{
for (int i = 2; i*i <= p; i ++)
if (p%i == 0) return false;
return true;
}
void dfs(int x)
{
prime[cnt++] = x; // x为素数, 存下来
for (int i = 1; i <= 9; i ++)
{
int p = x*10 + i;
if

本文介绍了一种编程方法,利用递归深度优先搜索(DFS)从低位到高位寻找并输出所有满足特定条件的素数,即去掉最后一位后仍是素数。这种方法避免了正向逐个验证的复杂性,共找到83个不超过32位int范围内的素数。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



