Lỗi gặp phải khi giải bài toán xác định số đối xứng
Chào mọi người. Mình đang làm bài toán “Nhập vào một số nguyên dương n, cho biết đó có phải là số đối xứng hay không?”.
Hướng giải của mình :
-
B1. Nhập vào số nguyên dương n
-
B2. Xác định số chữ số của số nhập vào (idem)
-
B3. Xác định số đảo ngược của số nhập vào.
-
B4. So sánh -> kết luận.
Dưới đây là code :
int main()
{
int iN = 0, idem = 0, isoDaoNguoc = 0;
do
{
printf("Hay nhap vao mot so nguyen duong n bat ky :");
scanf("%d",&iN);
if (iN < 0)
printf("So ban vua nhap khong phai la mot so nguyen duong.
");
}while (iN < 0);
int temp1 = iN;
while(temp1!=0)
{
temp1 /= 10;
idem++;
}
printf("%d
",idem);
int temp = iN;
for (int iDem = idem - 1; 0 <= iDem; iDem--)
{
int sodu = 0;
sodu = temp % 10;
temp /= 10;
isoDaoNguoc = isoDaoNguoc + sodu * pow(10,iDem);
}
printf("%d
",isoDaoNguoc);
if (iN==isoDaoNguoc)
printf("So %d la so doi xung",iN);
else
printf("So %d khong phai la so doi xung",iN);
return 0;
}
Tuy nhiên khi chạy thì xảy ra trường hợp :
-
Nhập vào số 1234 thì số đảo ngược là 4321 -> báo không phải số đối xứng. Code chạy ok.
-
Nhập vào 121 thì số đảo ngược là 120 -> báo không phải số đối xứng. Code sai.
-
Nhập vào 123321 thì số đảo ngược là 123321 -> báo số đó là số đối xứng. Code chạy ok.
Mình có print ra biến idem và số đảo ngược để kiểm tra thì thấy biến idem ra giá trị đúng.
Vậy mình không hiểu sao lại có trường hợp sai trường hợp đúng như trên.
Mình biết bài này rất cơ bản, mình có search lời giải trên mạng nhưng họ dùng cách khác ngắn gọn hơn. Ở đây điểm mình muốn biết là TẠI SAO CODE CỦA MÌNH LẠI SAI? MÌNH KHÔNG NGHĨ RA ĐIỂM SAI. Mình là newbie. Mong mọi người giúp. Cảm ơn!
Vì sử dụng hàm
pow()
ta quan sát chuỗi biến đổi sau:2, 4, 7, 3
2 -> 20 -> 24 -> 240 -> 247 -> 2470 -> 2473 đây là chiều xuôi.
Do lấy mod 10 là kiểu in ngược nên việc đảo ngược không khó.
À cám ơn. Dựa vào gợi ý của bạn mình đã tìm đọc lại về hàm pow(). Sau khi chuyển biến isoDaoNguoc về dạng double thì kết quả đã đúng. Tuy nhiên mình muốn hỏi thêm chút
double pow (double,double)
; nhưng bên trong ngoặc mình để 2 biến dạng int, hàm vẫn chạy .Vấn đề không phải là bạn nạp cái gì, mà kết quả trả về là double, chắc chắn sẽ có sai số.
Khi hàm gặp tham số truyền vào có kiểu số khác double thì nó tự động ép kiểu.
Viết hàm pow với số nguyên riêng là tốt nhất, đỡ phải chuyển về double hay lo sợ sai số
Thao tác với chữ số thì không nên xài pow() vì nó thừa bước và không đẹp.
Bạn có thể sửa giúp mình vào code để mình hiểu rõ ý bạn hơn được không?
x <- x * 10 + n % 10
2, 4, 7, 3:
0 -> 0+2 = 2 -> 20+4 = 24 -> 240+7 = 247 -> …