洛谷 B3939 [GESP样题 四级] 绝对素数: 思路 和 C++ 题解
第 x x x 篇 优快云!( x ≥ 7 x \ge 7 x≥7 )
假设有这么一个方法 i s A b s o l u t e P r i m e ( i n t n ) isAbsolutePrime(int\ n) isAbsolutePrime(int n) 可以判断 n n n 是不是绝对素数…
那么,从 a a a 到 b b b 枚举,每次调 i s A b s o l u t e P r i m e ( ) isAbsolutePrime() isAbsolutePrime(),如果返回 t r u e true true,就输出。
可是 i s A b s o l u t e P r i m e isAbsolutePrime isAbsolutePrime 该怎么写?
首先,如果
n
≤
1
n \le 1
n≤1,肯定不是绝对素数,返回
f
a
l
s
e
false
false.
那么从
2
2
2 到
n
\sqrt{n}
n 进行枚举,如果有一个数字
i
i
i 满足
n
m
o
d
i
=
0
n\ mod\ i=0
n mod i=0,那么
n
n
n 为合数,返回
f
a
l
s
e
false
false.
接着,将
n
n
n 翻转,这里可以用点字符串…
假设
s
s
s 是
n
n
n 的字符串形式,那么将
s
s
s 翻转并转为数字就是
n
n
n 翻转过后的结果。
字符串的翻转可以用 a l g o r i t h m . h algorithm.h algorithm.h 头文件中的 r e v e r s e ( _ B i t e r , _ B i t e r ) reverse(\_Biter, \_Biter) reverse(_Biter,_Biter) 方法,其中 _ B i t e r \_Biter _Biter 是一个指针,第一个表示从哪开始反转。第二个表示从哪结束反转,正好, s t i r n g stirng stirng 类型有两个指针 s t r i n g . b e g i n ( ) string.begin() string.begin() 和 s t r i n g . e n d ( ) string.end() string.end() 表示字符串的开头指针与结束指针。
将他反转过后再把他转成整数就可以了。
接着,我们把上面判断素数的代码 C t r l + C , C t r l + V Ctrl+C, Ctrl+V Ctrl+C,Ctrl+V 一下。
最后,如果前面没有返回 f a l s e false false,那么返回 t r u e true true,表示 n n n 是一个绝对素数。
所以,上代码!
#include <bits/stdc++.h>
using namespace std;
int a, b;
int absolutePrime(int n) {
if (n <= 1)
return false;
for (int i = 2;i * i <= n;i ++)
if (n % i == 0)
return false;
string alter = to_string(n);
reverse(alter.begin(), alter.end());
n = stoi(alter);
for (int i = 2;i * i <= n;i ++)
if (n % i == 0)
return false;
return true;
}
int main() {
cin >> a >> b;
for (int i = a;i <= b;i ++)
if (absolutePrime(i))
cout << i << endl;
}
总结:
判断素数时从
2
2
2 到
n
\sqrt{n}
n 枚举