原来的代码:
#include<bits/stdc++.h>
using namespace std;
bool is_prime(int s) {
for(int i = 2; i * i <= s; i++) {
if(s % i == 0)return 0;
}
return 1;
}
bool is_hw(int a) {
int b = 0, s = a;
while(s != 0) {
b = b * 10 + s % 10;
s /= 10;
}
return a == b;
}
int main() {
int a, b;
cin >> a >> b;
for(int i = a; i <= b; i++) {
if(is_hw(i) && is_prime(i))cout << i << '\n';
}
}
使用各种卡常技巧还是过不了,多几 ms。记录。
但是如果在判断回文数时特判个位数,变成这样:
#include<bits/stdc++.h>
using namespace std;
bool is_prime(int s) {
for(int i = 2; i * i <= s; i++) {
if(s % i == 0)return 0;
}
return 1;
}
bool is_hw(int s) {
if(s < 10)return 1;
int b = 0, t = s;
while(s) {
b = b * 10 + s % 10;
s /= 10;
}
return t == b;
}
int main() {
int a, b;
cin >> a >> b;
for(int i = a; i <= b; i++) {
if(is_hw(i) && is_prime(i))cout << i << '\n';
}
}
就能减少约 300 ms 的运行时间。记录。
请问这是为什么?