题目描述
输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1。
输入描述:
输入有多组数据。 每组一行,输入n。
输出描述:
输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数(素数之间用空格隔开,最后一个素数后面没有空格),如果没有则输出-1。
示例1
输出
复制11 31 41 61 71
#include<iostream> #include<cstdio> #include<cstring> #include<stdlib.h> #include<algorithm> using namespace std; bool a[10010]= {0}; int b[10000]; int x=0; void prime(int n)//如何求大数内的素数。 { for(int i=2; i<n; i++) { if(a[i])continue;//标记为true表示不是素数。是合数。 b[x++]=i; for(int j=i*i; j<n; j+=i) a[j]=true; } } int main() { int n; cin>>n; prime(n); int ct=0; for(int i=0; i<x; i++) { if(b[i]%10==1) ct++; } if(ct==0) cout<<-1; else { for(int i=0; i<x; i++) { if(b[i]%10==1) { cout<<b[i]; ct--; if(ct!=0) cout<<' '; } } } return 0; }
//这个题真的是简单的,但是求素数的时候我还是遇到了一个小问题,就是第二层循环,应该是从i*i那个地方开始开始标记,并且j+=i这样,比i*2开始快了2ms,求素数,如果是合数则被标记为true;
2018-9-9更:
1.考点就是如何求大数内的所有素数,不是一个一个去遍历求解,那样一定会超时,
2.而是使用了两个数组,标记是否是素数,并且将从i*i都一起标记为不是素数。
//学习了!