问题:
编程找出所有的4位超级素数。每行输出6个数,两个数之间空格分隔。
超级素数:一个n位超级素数是指一个n位正整数,它的前1位、前2位、、、前n位都数。如2333是一个4位超级素数,因为2,23,233,2333都是素数。
分析:
利用素数筛选法先筛选出4位数以内的所有的素数,然后在其中寻找满足4位超级素数的数来。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <algorithm>
#include <iomanip>
#define MAX 10000
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int prime[MAX];
bool mark[MAX];
int length = 0;
void init() {
memset(mark,false,sizeof(mark));
for(int i=2;i<MAX;i++){
if(mark[i] == true){
continue;
}
mark[i] = true;
prime[length++] = i;
for(int j=i*i;j>= 0 && j<MAX;j+=i){
mark[j] = true;
}
}
}
bool isPrime(int x){
for(int i=0;i<length;i++){
if(x == prime[i]){
return true;
}
}
return false;
}
int main(int argc, char** argv) {
//1.预处理 先筛选出一定范围内的素数
init();
//2.在筛选出的素数中找到所有4位素数,判断是否满足条件进行输出
int count=0;
for(int i=0;i<length;i++) {
if(prime[i] / 1000 == 0){
continue; //不够4位
}
if(isPrime(prime[i]/1000) && isPrime(prime[i]/100) && isPrime(prime[i]/10) && isPrime(prime[i])){
if(count == 6){
printf("%d",prime[i]);
}else{
printf("%d ",prime[i]);
}
count++;
}
if(count == 6){
count=0;
printf("\n");
}
}
return 0;
}