Lỗi trong chương trình kiểm tra số đối xứng?

Xin chào các bạn. Mình có viết xong 1 chương trình kiểm tra xem số đảo ngược của nó là bao nhiêu? (ví dụ số đảo ngược của 123 là 321; 146 là 641; …).
Rồi sau đó kiểm tra xem đó có phải là số đối xứng không.

Số đối xứng là số mà khi đọc từ trái sang phải hay phải sang trái đều như nhau.
VD: 12021 => Đọc từ phải sang trái là 12021, trái sang phải cũng là 12021 ; .....

Nhưng chương trình mình có bị lỗi gì hay sao ấy? Các bạn chạy thử là biết. Ví dụ mình nhập thử 1 số đối xứng là 12021. Nhưng khi enter xong, chương trình là cho kết quả mình không mong muốn như hình dưới đây:

Đó, tự nhiên chữ số cuối không phải là 1 mà là 0. Mình dùng IDE Code::Blocks. Mình đã kiểm tra rất kỹ từng dòng code. Debug lại mấy lần. Nhưng khi debug mình gặp 1 cái lỗi ngớ ngẩn mà không biết sai ở đâu. Do hơi bất tiện nên mình không up hình được.
Chỉ biết là khi debug xong dòng 29 thì đáp án là sodaonguoc = 99, trong khi đó mình tính thủ công thì là 100. Bạn nào giỏi giúp hộ mình nhé. Mình cảm ơn rất nhiều! :slight_smile:

Code:

#include <stdio.h>// *Important: Variable " const "
#include <limits.h>
#include <float.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
#include <Windows.h>
#include <time.h>
int main()
{
    int n;
    do
    {
        printf("Type a number: ");
        scanf("%d", &n);
        if (n <= 0)
            printf("So khong hop le, moi nhap lai\n");
    }
    while(n <= 0);
    int temp = n;
    int sodaonguoc = 0;
    int digit = log10(temp);
    while (temp != 0)
    {
        int dem = temp%10;
        temp/=10;
        sodaonguoc += dem * pow(10.0,digit--);
    }
    printf("So dao nguoc cua %d la %d\n",n,sodaonguoc);
    if (sodaonguoc == n)
        printf("Day la so doi xung\n");
    else
        printf("Day khong phai la so doi xung\n");
    getch();
    return 0;
}
1 Like

int digit = log10((double)temp)

Cảm ơn bạn nhưng nó cũng bị lỗi như thế à bạn ơi :cold_sweat:

Có thể hàm pow đã bị làm tròn xuống do có sai số. Để hạn chế sai số do việc này, bạn chỉ cần thêm ceil(pow(...))

1 Like

Số đảo ngược của n là:

int result = 0;
        while(n > 0){
            result = result*10 + n % 10;
            n /= 10;
        }
=> result.
1 Like

Không hổ danh là Leader. Cảm ơn anh rất nhiều :smiley: . Anh có thể nói sâu 1 chút về cái vấn đề này không ạ? Tức là tác dụng của ceil(pow(...)) :slight_smile:

Wow, khá logic đó anh ạ :slight_smile:
result = result*10 + n % 10; là logic do anh nghĩ ra hay là 1 công thức nào đó có sẵn?

Trả lời hộ luôn :joy: [quote=“Gio, post:4, topic:25073, full:true”]
Có thể hàm pow đã bị làm tròn xuống do có sai số. Để hạn chế sai số do việc này, bạn chỉ cần thêm ceil(pow(…))
[/quote]

:joy: Bác hỏi toàn câu khó.

Không hiểu?..

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