输入一个整数 n,要求输出所有从 1 到这个整数之间(不包括 1 和这个整数)个位为 1 的素数,如果没有则输出 −1。
输入格式
输入包含多组测试数据。
每组数据占一行,包含一个整数 n。
输出格式
每组数据输出占一行,由小到大输出所有满足条件的素数,素数之间单个空格隔开。如果没有则输出 −1。
数据范围
2≤n≤10000,
输入最多包含 100 组数据。
输入样例:
100
输出样例:
11 31 41 61 71
之前的判断方法还是复杂度高了点,数据过了10/11
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
bool pd(int n){
for (int i = 2; i <= sqrt(n); i ++ )
if(n % i == 0)
return false;
return true;
}
bool pd1(int n){
if(n % 10 != 1)
return false;
else
return true;
}
int n , k = 0;
int main()
{
while(cin >> n){
for (int i = 2; i < n; i ++ ){
if(pd(i) != 0 && pd1(i) != 0){
cout << i << " ";
k ++;
}
}
if(!k)
cout << -1;
cout << endl;
}
return 0;
}
优化后AC,在for循环设置那里重新编写,每次i变化后循环的终止条件也跟着变化,且是逐渐变小,复杂度自然下降
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
bool prime(int x)
{
for(int i = 2 ; i <= x / i ; i ++)//循环的设置,点睛之笔
if(x % i == 0)
return 0;
return 1;
}
int main()
{
int n , i;
while(cin >> n){
bool ok = 0;
for(int i = 2 ; i <= n - 1 ; i ++)
if(prime(i) && i % 10 == 1)
cout << i << ' ' , ok = 1;
if(ok == 0)
cout << -1;
cout << '\n';
}
}