30/09/2018, 20:35

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!

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
");
    }
    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,sodaonguoc);
    if (sodaonguoc == n)
        printf("Day la so doi xung
");
    else
        printf("Day khong phai la so doi xung
");
    getch();
    return 0;
}
quy viết 22:40 ngày 30/09/2018

int digit = log10((double)temp)

Người bí ẩn viết 22:50 ngày 30/09/2018

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

Gió viết 22:46 ngày 30/09/2018

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(...))

X viết 22:35 ngày 30/09/2018

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

int result = 0;
        while(n > 0){
            result = result*10 + n % 10;
            n /= 10;
        }
=> result.
Người bí ẩn viết 22:44 ngày 30/09/2018

Không hổ danh là Leader. Cảm ơn anh rất nhiều . 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(...))

Người bí ẩn viết 22:39 ngày 30/09/2018

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

Ngô Doãn Tuấn viết 22:44 ngày 30/09/2018

Tức là tác dụng của ceil(pow(…))

Trả lời hộ luôn [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]

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

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

Người bí ẩn viết 22:35 ngày 30/09/2018

Trả lời hộ luôn

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

Không hiểu?..

Bài liên quan
0