题目描述
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 (is_prime(p)) dfs(p);
}
}
int main()
{
dfs(2),dfs(3),dfs(5),dfs(7); // 从个位开始
qsort(prime,cnt,4,cmp);
for (int i = 0; i < cnt; i ++)
printf("%d %d\n",i+1,prime[i]);
return 0;
}