1.
从数学的角度: 1.首位只能是质数2 3 5 7
2.其余位只能是1,3,7,9
3.若n=1,直接输出2,3,5 7
但是当把定义文件输入输出流放在全局变量的时候,就AC了。。。。不明原因。。。。
4. 官方参考代码:
从数学的角度: 1.首位只能是质数2 3 5 7
2.其余位只能是1,3,7,9
3.若n=1,直接输出2,3,5 7
直接DFS 1~9,加入当前数末尾,并判断是不是素数,是则递归处理下一位数,不是则回溯,直到depth>n。不会超时。
2. 这道题折磨了我好久,一直出现
Execution error: Your program (`sprime') exited with signal #11 (segmentation violation [maybe caused by accessing memory out of bounds, array indexing out of bounds, using a bad pointer (failed open(), failed malloc), or going over the maximum specified memory limit]). The program ran for 0.000 CPU seconds before the signal. It used 3188 KB of memory.
但是当把定义文件输入输出流放在全局变量的时候,就AC了。。。。不明原因。。。。
2. 以下是代码
/*
ID: dollar4
PROG: sprime
LANG: C++
*/
#include <fstream>
#include <cmath>
using namespace std;
int num[5000] = {2, 3, 5, 7};
ofstream fout ("sprime.out");
ifstream fin ("sprime.in");
int check(int a)
{
for (int i = 3; i * i <= a; i += 2)
if (a % i == 0)
return 0;
return 1;
}
int main()
{
int n, i;
// memset(num, 0, sizeof(num));
// num[0] = 2;
// num[1] = 3;
// num[2] = 5;
// num[3] = 7;
fin >> n;
int front = 0;
int rear = 4;
int maxn = pow(10.0, n);
int minn = maxn / 10;
while (front < rear)
{
int k = num[front++];
if (check(k * 10 + 1))
num[rear++] = k * 10 + 1;
if (check(k * 10 + 3))
num[rear++] = k * 10 + 3;
if (check(k * 10 + 7))
num[rear++] = k * 10 + 7;
if (check(k * 10 + 9))
num[rear++] = k * 10 + 9;
if (num[rear-1] > maxn - 1)
break;
}
for (i = 0; num[i] < maxn; i++)
if (num[i] >= minn)
fout << num[i] << endl;
return 0;
}
4. 官方参考代码:
We use a recursive search to build superprimes of length n from superprimes of length n-1 by adding a 1, 3, 7, or 9. (Numbers ending in any other digit are divisible by 2 or 5.) Since there are so few numbers being tested, a simple primality test suffices.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
FILE *fout;
int
isprime(int n)
{
int i;
if(n == 2)
return 1;
if(n%2 == 0)
return 0;
for(i=3; i*i <= n; i+=2)
if(n%i == 0)
return 0;
return 1;
}
/* print all sprimes possible by adding ndigit digits to the number n */
void
sprime(int n, int ndigit)
{
if(ndigit == 0) {
fprintf(fout, "%d\n", n);
return;
}
n *= 10;
if(isprime(n+1))
sprime(n+1, ndigit-1);
if(isprime(n+3))
sprime(n+3, ndigit-1);
if(isprime(n+7))
sprime(n+7, ndigit-1);
if(isprime(n+9))
sprime(n+9, ndigit-1);
}
void
main(void)
{
int n;
FILE *fin;
fin = fopen("sprime.in", "r");
assert(fin != NULL);
fout = fopen("sprime.out", "w");
assert(fout != NULL);
fscanf(fin, "%d", &n);
sprime(2, n-1);
sprime(3, n-1);
sprime(5, n-1);
sprime(7, n-1);
exit (0);
}