Hàm kiểm tra số đảo ngược trong C

đây là hàm kiểm tra một số có phải số đảo ngược không. em cho chạy hàm này thì kiểm tra đúng số đảo ngược, nhưng số không đảo ngược thì chỉ kiểm tra đúng số có chẵn chữ số, còn số có lẻ chữ số thì vẫn in ra “đây là số đảo ngược”. VD:
12321 -> đây là số đảo ngược
123456 -> đây không phải số đảo ngược
12345 -> đây là số đảo ngược
tìm lỗi hộ em với ạ

void sodaonguoc(int x){
        int b;
        int count=0;
        int a[max];
        int i=0;
        while (x!=0)
        {
            int d=x%10;
            x/=10;
            count++;
            
            a[i]=d;
            i++;
        }
        int j=count;
        for (int i = 0; i <= count/2; i++)
        {
            j--;
            {
                if (a[i]!=a[j]) b=0;
                else b=1;
            }
            
        }
        if (b==1)
        {
            printf("day la so dao nguoc");
        }
        else if (b==0)
        {
            printf("day khong phai so dao nguoc");
        }

Gợi ý cho bạn chỗ kiểm tra số đảo ngược nha:

Vì bạn chỉ cần kiểm tra xem nếu có một cái a[i] != a[j] là nên cho thoát vòng lặp luôn, còn nếu không nó sẽ chạy tiếp và nhỡ đâu sẽ có một cặp khác nó lại bằng nhau và b của bạn nó lại về 1 thì sao. Dưới đây là code minh sửa lại nha. :point_down:

b = 1;
for (i = 0, j = count - 1; i < j; i++, j--) {
  if (a[i] != a[j]) {
    b = 0;
    break;
   }
}
1 Like

code trên chạy thì được rồi ạ. nhưng mà giải thích hộ em tại sao code của em chỉ kiểm tra được những số không đảo ngược có chẵn chữ số thôi với ạ

Chạy được, 1223 mà là số đảo ngược? :thinking:
link: :point_right: https://ideone.com/glSS4x

1 Like

thì thế nên em mới hỏi

Lý do mình nói rồi mà nhỉ:

1 Like

Câu này hỏi nhiều nè, mà ai cũng chơi mảng hết là sao ta?

int reverse(int x) {
    int r = 0;
    while (x) {
        r = 10 * r + x % 10;
        x /= 10;
    }
    return r;
}

bool is_palindrome(int x) {
    return x == reverse(x);
}
5 Likes

Đúng r Chuột ca ca, e làm sẽ làm như thế này, nhưng mà thớt nói là giải thích code chứ có phải là hỏi thuật toán đâu. :kissing:

2 Likes

số 12223 thì nó in ra “day khong phai so dao nguoc”

Đúng r, theo thuật toán của bạn thì mọi số có số chữ số là số lẻ thì cái phần kiểm tra của bạn

Khi này đoạn cuối cùng thì cả a[i]a[j] nó đều chỉ cùng một số, vd 12223, thì nó đều là a[i] = a[j] = 2 (2 ở chính giữa). Và như vậy b = 1. Kết quả là in ra day la so dao nguoc
Link code check :point_right: https://ideone.com/YX36GP.


Edit thêm code đã fix
link :point_right: https://ideone.com/ajtunR

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