jywa @ 2024-08-18 20:04:57
这个代码只过了#1、#2和#6,其他全是TLE,请各位大佬帮忙指点一下
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int n){
if(n==0||n==1)return 0;
else{
for(int i=2;i<n;i++){
if(n%i==0)return 0;
}return 1;
}
}
bool isPalindrome(int num){
int p=num;
int k=0;
while(p!=0) {
k=k*10+p%10;
p=p/10;
}if(k==num)return 1;
else return 0;
}
int main(){
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++){
if(isPrime(i)&&isPalindrome(i))printf("%d\n",i);
}return 0;
}
谢谢您们的帮助!!!
by Mzh2012 @ 2024-08-18 20:07:58
@jywa 数据范围1亿,太大了你的代码时间复杂度太高了
by jywa @ 2024-08-18 20:10:14
@Mzh2012 那怎么改能对?大佬,我看他们讨论说要用打表? 这么改还是不对(刚才想起来b不能比a小)
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int n){
if(n==0||n==1)return 0;
else{
for(int i=2;i<n;i++){
if(n%i==0)return 0;
}return 1;
}
}
bool isPalindrome(int num){
int p=num;
int k=0;
while(p!=0) {
k=k*10+p%10;
p=p/10;
}if(k==num)return 1;
else return 0;
}
int main(){
int a,b;
cin>>a>>b;
if(b<a)swap(a,b);
for(int i=a;i<=b;i++){
if(isPrime(i)&&isPalindrome(i))printf("%d\n",i);
}return 0;
}
请大佬指点
by Mzh2012 @ 2024-08-18 20:14:50
@jywa 可以打表 我也是打表,但你的代码打表的话可能要打好久,要先优化一下判断素数再打表。
by Mzh2012 @ 2024-08-18 20:15:50
@jywa 把
bool isPrime(int n){
if(n==0||n==1)return 0;
else{
for(int i=2;i<n;i++){
if(n%i==0)return 0;
}return 1;
}
}
换成
bool isPrime(int n){
if(n==0||n==1)return 0;
else{
for(int i=2;i*i<=n;i++){
if(n%i==0)return 0;
}return 1;
}
}
就可以开始打表了。
by Mzh2012 @ 2024-08-18 20:17:55
@jywa 如果你不想打表的话可以去看看题解是怎么优化的。
by jywa @ 2024-08-18 20:18:44
那大佬您看这样行不行?他们说要加上:
if(b>100000000)b=100000000;
然后将类型改为long long?
#include<bits/stdc++.h>
using namespace std;
bool isPrime(long long n){
if(n==0||n==1)return 0;
else{
for(long long i=2;i<n;i++){
if(n%i==0)return 0;
}return 1;
}
}
bool isPalindrome(long long num){
long long p=num;
long long k=0;
while(p!=0) {
k=k*10+p%10;
p=p/10;
}if(k==num)return 1;
else return 0;
}
int main(){
long long a,b;
cin>>a>>b;
if(b<a)swap(a,b);
if(b>100000000)b=100000000;
for(long long i=a;i<=b;i++){
if(isPrime(i)&&isPalindrome(i))printf("%d\n",i);
}return 0;
}
以大佬怎么看?还请多多指教。
by jywa @ 2024-08-18 20:20:47
@Mzh2012 大佬,我样例试过了……但放进去只有33分,7个TLE,TLE是啥意思?是超时吗?
by Mzh2012 @ 2024-08-18 20:22:30
@jywa 这不一样的吗,题目不是说了
by Mzh2012 @ 2024-08-18 20:22:51
@jywa TLE 是超时
by Emil_ @ 2024-08-18 20:22:59
@jywa ac代码:挺好理解的,先判回文后判质数
#include<bits/stdc++.h>
using namespace std;
bool huiwen(int n){
bool r=true;
int w[15]={};
int k=1;
while(n>0){
w[k]=n%10;
k++;
n/=10;
}
for(int i=1;i<=k;i++){
if(w[i]!=w[k-i]){
r=false;
}
}
return r;
}
int main(){
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++){
if(i%2==0){
i++;
}
if(huiwen(i)==true){
bool f=true;
for(int j=2;j<=sqrt(i);j++){
if(i%j==0)
f=false;
}
if(f)
cout<<i<<endl;
}
}
return 0;
}
求关qwq