The set of ribs denoted by 7331 is prime; the three ribs 733 are prime; the two ribs 73 are prime, and, of course, the last rib, 7, is prime. The number 7331 is called a superprime of length 4.
Write a program that accepts a number N 1 <=N<=8 of ribs and prints all the superprimes of that length.
The number 1 (by itself) is not a prime number.
题意是,定义一种数字,例如7331,第一位7是质数,前两位73拿出来也是质数,前三位733也是质数,7331也是质数。
找出所有n位的并满足以上条件的数字,n<8。
交了无数次,要么数组越界要么超时。
想法是这样的,用素数筛找出<100000的所有质数存在数组p中,然后从长度为一位的质数开始寻找特殊质数,保存在b中。当然一位的是2,3,5,7。
还有两个常量,first是当前长度的特殊质数从b数组的哪一个开始,len是当前长度的特殊质数有多少个。然后 比当前长度多一位的特殊质数 必定是 当前长度特殊质数 乘1or3or7or9,然后通过数组b(保存了小于100000的质数)判断该数是不是素数即可。
#include<bits/stdc++.h> using namespace std; int a[100000]={0}; int b[100000]={2,3,5,7}; int p[100000]={0}; int n; int prime(int m) { for(int i=1;i<=p[0]&&m>p[i];i++) { if(m%p[i]==0) return 0; } return 1; } int superprime(int first,int len) { int num=0; for(int i=first;i<first+len;i++) { for(int j=1;j<10;j+=2) { if(j!=5&&prime(b[i]*10+j)) { b[first+len+num]=b[i]*10+j; num++; } } } return num; } int main() { int first=0,len=4,num=0; scanf("%d",&n); for(int i=2;i*i<100000;i++) for(int j=i;a[i]==0&&j*i<100000;j++) { a[i*j]=1; } for(int i=3;i<100000;i++) if(a[i]==0) p[++p[0]]=i; for(int i=2;i<=n;i++) { num=superprime(first,len); first=first+len; len=num; } for(int i=first;i<num+first;i++) printf("%d\n",b[i]); return 0; }
时间: 2024-10-25 00:42:29