Cần hỗ trợ tối ưu code tìm số nguyên tố sao cho đảo ngược nó vẫn được số nguyên tố

e có bài tập như sau:
Có một vài số nguyên tố khi viết đảo lại nó cũng là số nguyên tố. Ví dụ như 17 hay 71 đều là số nguyên tố. Cho hai số a và b hãy tìm xem có bao nhiêu số x nằm trong đoạn [a, b] sao cho khi viết xuôi hay viết đảo số đó đều là số nguyên tố.
ví dụ Input 5 150
Output 16
e code như sau thì bị time limited exceed :slight_smile:
cho em hỏi còn cách nào tối ưu code để tránh lỗi time limited exceed ko ạ ( ko được dùng #include ) :

using namespace std;

int sdn(int N)
{
     
    int nghichdao = 0 ;
    
    while(N != 0)//Neu  so gan con khac 0 thuc hien vong lap
    {
        nghichdao = nghichdao * 10 + N%10;
        N = N / 10;//bien N chia 10
    }
    return nghichdao;
}

bool kt(int N)
{
    if (N<2) return false;
    if ((N!=2)&&(N%2==0)) return false;
    for (int i = 2; i <= N/2; i++)
    {
        if (N % i == 0)
            return false;
    }
    return true;
}
 
int main()
{
    int i,a,b,s=0;
    cin>>a>>b;
    for(i=a;i<=b;++i){
       if(kt(i) && kt(sdn(i)))
            s+=1;
    }
    cout<<s;
    return 0;
}

Chỗ điều kiện vòng lặp thay bằng i * i <= N là dễ nhất.
Để tối ưu thì cần tính căn bậc hai của N.

2 Likes

bài này ko cho dùng thêm #include nên e ko gọi thêm thư viện được thành ra ko sử dụng sqrt đc
e thử thay thế bằng i*i<N thì cho kết quả là wrong

Bạn thử test 373 373, 130 1300 1000 xem kết quả là bao nhiêu.

Thử in thêm các số thoả mãn bên trong vòng lặp để xem có liệt kê thừa hay thiếu số nào không nhé.

Anh @rogp10 nói là

nhưng bạn lại code

là không ổn rồi. Bạn thử test 9 9 là rõ.

3 Likes

Bài này sẽ sàng đoạn [a, b] trước để lấy số nguyên tố rồi mới thử số đảo ngược :slight_smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?