Oscar111111 @ 2024-07-02 13:27:39
#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){
if(n==1||n==0) return false;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0) return false;
return true;
}
bool isplindromes(int n){
int m=0,x=n;
while(x!=0){
m=m*10+x%10;
x=x/10;
}
if(n==m) return true;
else return false;
}
int main()
{
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++)
if(isprime(i)&&isplindromes(i)) cout<<i<<endl;
return 0;
}
AC AC AC AC AC AC TLE TLE TLE
by donghanwen1225 @ 2024-07-02 13:56:30
@Oscar111111 代码超时是由于复杂度过大而引起的,需要优化算法才能解决。
首先,判定一个数是不是质数的复杂度要高于判定是不是回文数。所以先判定是否为回文数,如果不是就直接跳过,可以节省计算次数;
同时,利用能整除
by Oscar111111 @ 2024-07-02 14:00:06
#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){
if(n==1||n==0) return false;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0) return false;
return true;
}
bool isplindromes(int n){
int m=0,x=n;
while(x!=0){
m=m*10+x%10;
x=x/10;
}
if(n==m) return true;
else return false;
}
int main()
{
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++){
if(isplindromes(i))
if(isprime(i)) cout<<i<<endl;
}
return 0;
}
88分
by syy999 @ 2024-07-05 09:18:59
我也是
#include<bits/stdc++.h>
using namespace std;
#define int long long
bool p(int a){
if(a==1) return 0;
for(int i=2;i<=sqrt(a);i++) if(a%i==0) return 0;
return 1;
}
bool h(int a){
int f=0,t=a;
while(t!=0){
f=f*10+t%10;
t=t/10;
}
if(f==a) return 1;
else return 0;
}
signed main(){
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++){
if(p(i)&&h(i)) cout<<i<<endl;
}
return 0;
}
by Ascnbeta @ 2024-07-05 14:59:17
@Oscar111111 你还没有把偶数和偶数数位的回文数continue掉啊
by Ascnbeta @ 2024-07-05 15:05:15
@syy999 偶数数位的回文数和偶数都一定不是质数(可自行搜索能被11整除的数的特征),因此它们需要被continue掉(即两位数、四位数、六位数、八位数一定不满足题意)
另外 p(i)&&h(i)
的方式会导致先判断该数是不是质数,再判断该数是不是回文数(不理解可以搜&&的判断过程),由于判断质数的时间复杂度更高,所以会浪费时间。因此应当改成 h(i)&&p(i)
by Oscar111111 @ 2024-07-18 14:14:44
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++){
if(i%2==0&&i!=2) continue
if(isplindromes(i))
if(isprime(i)) cout<<i<<endl;
}
return 0;
by Oscar111111 @ 2024-07-18 14:20:55
AC了!!!!!!!!!!!!
by syy999 @ 2024-07-24 11:12:11
AC了!!!!!!!!!!!!