社区讨论

88分,求优化

P1217[USACO1.5] 回文质数 Prime Palindromes参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mdocwbt3
此快照首次捕获于
2025/07/29 17:50
7 个月前
此快照最后确认于
2025/11/04 03:31
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

bool huiwen(int a){
	string s=to_string(a);
	string s1=s;
	reverse(s1.begin(),s1.end());
	if(s==s1) return true;
	else return false;
} 

bool zhishu(int n){
	if(n<=1) return false;
	if(n==2) return true;
	if(n%2==0||n%3==0) return false; 
	for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) {
            return false;
        }
    }
	return true;
}

int main(){
	ios::sync_with_stdio(false);
    cin.tie(nullptr);
	int a,b;
	cin>>a>>b;
	for(int i=a;i<=b;i++){
		if(huiwen(i)){
			if(zhishu(i)){
				cout<<i<<endl;
			}else{
				continue;
			}
		}else{
			continue;
		}
	}
	return 0;
}

上面是我的代码 下面是deepseek的AC代码(亲证AC):
CPP
#include <iostream>
#include <cmath>
using namespace std;

// 快速回文检查(数学方法)
inline bool is_pal(int num) {
    if (num < 10) return true;
    int n = num, rev = 0;
    while (n > 0) {
        rev = rev * 10 + n % 10;
        n /= 10;
    }
    return num == rev;
}

// 极致优化的质数检查
inline bool is_prime(int num) {
    if (num <= 1) return false;
    if (num <= 3) return true;
    if (num % 2 == 0 || num % 3 == 0) return false;
    
    // 6k±1优化
    for (int i = 5; i * i <= num; i += 6) {
        if (num % i == 0 || num % (i + 2) == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int a, b;
    cin >> a >> b;
    
    // 特殊处理小的回文质数
    const int small_primes[] = {2, 3, 5, 7, 11};
    for (int p : small_primes) {
        if (a <= p && p <= b) {
            cout << p << '\n';
        }
    }
    
    // 主检查范围(只检查6k±1形式的数)
    int start = max(a, 13);
    if (start % 2 == 0) start++;
    
    // 预计算平方根上限
    int sqrt_b = sqrt(b) + 1;
    
    for (int i = start; i <= b; i += 2) {
        // 快速预筛:回文数首尾数字必须相同
        if (i > 100) {
            int last = i % 10;
            int first = i;
            while (first >= 10) first /= 10;
            if (first != last) continue;
        }
        
        if (is_pal(i) && is_prime(i)) {
            cout << i << '\n';
        }
    }
    
    return 0;
}
因为deepseek的思路不是我的,所以想知道我的代码能不能优化到100分,求大佬康康,回复@我,必关~ 题外话:打了好几次88分,还蛮吉利的咧

回复

5 条回复,欢迎继续交流。

正在加载回复...