只对了一个点,求助

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

shunxinruyi @ 2024-11-03 08:19:44

#include<bits/stdc++.h>
using namespace std;
bool ttt(int i)
{
    if(i<=2) return 0;
    else
    {
        int s=2;
        while(s*s<=i)
        {
            if(i%s==0) return 0;
            s++;
        }
    }
  return 1;
}
int main()
{
    int a,b,mid,len,next,ans;
    cin>>a>>b;
    for(int i=a;i<=b;i++)
    {
        int t=0,s=i;
        if(i<=9&&ttt(i))
        cout<<i<<"\n";
        else if(i%10!=0)
        {
            while(s/=10)
            {
                t++;
            }
            s=i;
            ans=1;
            while(t>=ans)
            {

                len=pow(10,ans);
                next=pow(10,t);
                if(s%len!=s/next)
                {
                    break;
                }
                t--;
                ans++;
            }
            if(t>=ans)
            continue;
            else if(ttt(i)) cout<<i<<"\n";
        }
    }
}

by whr24syy119 @ 2024-11-03 20:38:52

主要有这几点问题:1,太复杂,思路不清晰。2,建议你写一个判回文数的函数。3,时间太高。


by whr24syy119 @ 2024-11-03 20:47:50

AC代码:

#include<bits/stdc++.h>
using namespace std;
bool ttt(int i)//判素数
{
    if(i<2) return 0;
    else
    {
        int s=2;
        while(s*s<=i)
        {
            if(i%s==0) return 0;
            s++;
        }
    }
  return 1;
}
bool huiwen(int n)//判回文数(性质:回文数倒过来与原数相同。如:12321)
{
    int x=0;
    int k=n;
    while(n!=0){
        x=x*10+n%10;
        n/=10;
    }
    if(x==k){
        return 1;
    }else{
        return 0;
    }
}
int main()
{
    int a,b;
    cin>>a>>b;
    if(a%2==0){//5以上的回文素数都是奇数。(看范围)
        a=a-1;
    }
    for(int i=a;i<=b;i+=2)//只判奇数。时间减半。
    {
        if(huiwen(i)){//先判回文。
            if(ttt(i)){//再判素数。
                cout<<i<<endl;
            }
        }
    }
    return 0;//return 0不要忘了。
}

by whr24syy119 @ 2024-11-03 20:48:58

@shunxinruyi


|