问题描述 :
有这样一种素数叫纯素数,当它是一个多位数的时候,你把它的末位去掉之后余下的数依然是一个素数。比如说2393,2393 本身是一个素数,它的末位去掉之后,余下的是239。239 是一个素数,它的末位去掉之后,余下的是23 。23是一个素数,它的末位去掉之后,余下的是2 。2依然还是一个素数。纯素数的长度叫做“维”。2393 是一个4维素数。3797也是一个4维素数。
提示:深度优先遍历
输入说明 :
第一行先给出一共有多少组数据N(N<=1000),接下来有N组数据.
每组包括一个整数T(1<=T<=8)。
输出说明 :
按照从小到大的顺序输出所有的T维纯素数。
输入范例 :
3
8
1
4
输出范例
23399339
29399999
37337999
59393339
73939133
2
3
5
7
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
算法思想
使用深度优先遍历,维度既是深度;
每往下一层深度加一,当前深度的数不是素数无需再往下遍历,是素数继续遍历下一层;
当深度等于维度时,如果是素数输出
深度遍历树如下图:
参考代码
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int isPrime(int k)
{
if (k == 1)
return 0;
if (k == 2)
return 1;
for (int i = 2; i < (int)sqrt(k) + 1; i++)
{
if (k % i == 0)
return 0;
}
return 1;
}
void depth(int dep, int n, int T)
{
int i, num;
for (i = 1; i < 10; i++)
{
num = n * 10 + i;
// 是素数且深度等于维度,输出
if (dep == T && isPrime(num))
{
printf("%d\n", num);
}
// 是素数 但深度小于维度,继续向下一层遍历
else if (dep < T && isPrime(num))
{
depth(dep + 1, num, T);
}
}
return;
}
int main()
{
int i, j, N, T;
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%d", &T);
depth(1, 0, T);
}
return 0;
}