题解区没有的构造回文数的短的AC代码

P1217 [USACO1.5] 回文质数 Prime Palindromes

Lntano_LYC @ 2024-09-15 21:29:38

构造回文数的短短的好理解的代码,见题解区没有,就分享给大家. 代码很好懂,就不作文字讲解了 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;
} 

by liruizhou_lihui @ 2024-09-15 21:40:26

@Lntano_LYC 你可以写成题解@管理员,我一般at chen_zhe,帖子违规jbl


by Lntano_LYC @ 2024-09-15 21:44:56

@liruizhou_lihui 我试试


by liruizhou_lihui @ 2024-09-15 21:47:04

@Lntano_LYC

https://help.luogu.com.cn/rules/academic/solution-standard


by Lntano_LYC @ 2024-09-15 23:15:42

@liruizhou_lihui 欸,我写了半个小时,整理格式弄了半个小时,结果最后申请题解的时候弹出的窗口说"这道题目不再接受新的题解" 文章都写好了/(ㄒoㄒ)/~~


by liruizhou_lihui @ 2024-09-15 23:51:06

@Lntano_LYC

你参考一下我交新题解的方法,管理at这些

要明确你的文章并且要说服别人你的题解不一样

https://www.luogu.com.cn/discuss/908849?page=1


by liruizhou_lihui @ 2024-09-15 23:53:46

@Lntano_LYC ##...##是划分题解板块的,例如思路分析,AC代码等而不是用来做强调的


by Lntano_LYC @ 2024-09-16 11:21:25

@liruizhou_lihui

洛谷 P1217

解法说明 :

1 . 回文数的组成往往由“半边”数字决定。

比如 122112 决定; 98789987 决定。 唯一的区别在于两个数字的处理顺序不同。

对于 \text{int } a = 12 \text{,} b = 12 \text{;}

而对于 $987$ , $ \text{int } a = 987 \text{,} b = 987 \text{;} $ 则是先让 $ b = b \div10 $ (注意 $b$ 除完 $10$ 之后为 $0$ 的可能!), 再让 $ a = a \cdot 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 代码如下: ```cpp #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; } ``` 蒟蒻的第一篇题解,难免啰嗦了一点,大家体谅哈!求管理员通过。

by delic1ous @ 2024-09-29 12:02:50

我的也不错,循环递推


by delic1ous @ 2024-10-08 12:06:53

@Lntano_LYC 你可能需要单开一个讨论再at管理员


|