NOI-OJ 1.13 ID:23 区间内的真素数
总时间限制: 1000ms 内存限制: 65536kB
描述
找出正整数 M 和 N 之间(N 不小于 M)的所有真素数。
真素数的定义:如果一个正整数 P 为素数,且其反序也为素数,那么 P 就为真素数。
例如,11,13 均为真素数,因为11的反序还是为11,13 的反序为 31 也为素数。
输入
输入两个数 M 和 N,空格间隔,1 <= M <= N <= 100000。
输出
按从小到大输出 M 和 N 之间(包括 M 和 N )的真素数,逗号间隔。
如果之间没有真素数,则输出 No。
样例输入
10 35
样例输出
11,13,17,31
关键点
- 找到素数(使用素数筛)
- 反序数
遇到的坑
int y = (temp%10)*(pow(10*1.0,(len-cot)*1.0))
由于左边是 d o u b l e double double类型,强转为 i n t int int,会舍掉后面的小数。这个必须要注意,目前的方法是将 y y y设置为 d o u b l e double double类型。vector.size()
的返回是 u n s i g n e d unsigned unsigned类型,如果是输出,没问题。但是如果进行比较运算,就会产生问题,可以强转为 i n t int int.string.size()
方法没有这个问题。
代码
const int maxn=100001;
int prime[maxn]; //prime存放所有素数
bool p[maxn] = {0}; //p[i]=0表示为素数
//素数筛
void Find_Prime(int m){
for(int i=2;i<=m;i++){
if(p[i]==false){
for(int j= 2*i;j<=m;j+=i){
p[j]=true;
}
}
}
}
/*
int reverse_int(int i){
double y = 0;
int temp = i;
int cot = 0;
//int len = floor(log10(i));
while(temp!=0){
y += (temp%10)*(pow(10*1.0,(len-cot)*1.0)); //99.9999
temp /= 10;
cot++;
}
return (int)y;
}
*/
int reverse_int(int i){
int y = 0;
int temp = i;
int cot = 0;
while(temp!=0){
y = y*10 + temp%10;
temp /= 10;
cot++;
}
return y;
}
int main(){
p[1] = 1;
vector<int> v;
int M, N;
//input
cin >> M >> N;
Find_Prime(maxn);
// Find reverse num
for(int i=M;i<=N;i++){
if(p[i]==false){
int res_i = reverse_int(i);
if(p[res_i]==false)
v.push_back(i);
}
}
int len_v = (int)(v.size());
//output
for(int i=0; i<len_v-1; i++){
cout << v[i] << ',';
}
if(!v.empty()){
cout << v[len_v-1];
}else{
cout << "No";
}
return 0;
}