洛谷 P1217
解法说明 :
$1$ . 回文数的组成往往由“半边”数字决定。
比如 $1221$ 由 $12$ 决定; $98789$ 由 $987$ 决定。唯一的区别在于两个数字的处理顺序不同,下面举两个例子分别表示一种处理顺序。
对于 $\ a = 12\text{,} b = 12 $
先让 $a = a \times 10 + b \bmod 10$,最后单独让 $b = b \div 10$,依此进入下一次循环(直到条件终止退出)。 最后取的值是 $a$ ,它的最终结果是 $1221$ 。
对于 $ a = 987 \text{,} b = 987 \text{}$
先让 $b = b \div10$ (注意 $b$ 除完 $10$ 之后为 $0$ 的可能!), 再让 $a = a \times 10 + b \bmod 10 $, 依此类推进入下一个循环(直到条件终止退出)。 最终要的结果也是 $a$ , 这个 $a$ 的结果是 $98789$ 。
$2$ . 被回文数决定的那“半边”数字是唯一的, 但那“半边”数字决定的回文数不是唯一的。
很好理解, 比如对于 $12$ 这个“半边”数字,它可以决定两个回文数,一个是 $121$,一个是 $1221$;所以我们重心是查找那“半边”数字上,由这个数字来构造回文数,一个回文数一个 for 循环,两个的话就是两个 for 循环。
所以对于最大值:${1} \times 10 ^ {8}$;组成它的“半边”数字便是
${1} \times 10 ^ {4}$,因此循环的开始值 $1$ 和最大值 ${1} \times 10^{4}$ 就有了。
AC 代码如下:
#include <bits/stdc++.h>
using namespace std;
map<int,int> mp;
vector<int> v;
int isprime(int x){
if(x == 1) return 0;
for(int i = 2 ; i <= x/i ; i++ )
if(x%i == 0) return 0;
return 1;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int a,b;cin >> a >> b;
string sa = to_string(a),sb = to_string(b);
int lena = sa.size(),lenb = sb.size(),ans;
for(int i = 1 ; i < 10000 ; i++){
int x1 = i, x2 = i, x3 = i, x4 = i;
for(int j = 0 ; j < to_string(i).size() ; j++){
x4/=10;
if(!x4)break;
x3=x3*10+x4%10;
}
if(x3>=a&&x3<=b&&isprime(x3)) v.push_back(x3);
for(int j = 0 ; j < to_string(i).size() && x2; j++){
x1=x1*10+x2%10,x2/=10;
}
if(x1>=a&&x1<=b&&isprime(x1)) v.push_back(x1);
}
sort(v.begin(),v.end());
for(int x : v) cout << x << endl;
return 0;
}
蒟蒻的第一篇题解,难免啰嗦了一点,大家体谅哈!求管理员通过。
洛谷的题解中没有一个是构造回文数的,所以我本来是想把这个发到题解区的,结果格式不符合那个管理员的要求,没成功