Tại sao pow(10, 2) ra 99?

#include <stdlib.h>
#include<math.h>


int main ()
{   int a=0,i=0,b=0, soMoi=0;
   printf("moi ban nhap so\n");
   scanf("%d",&a);
   b=a; // cho thêm 1 biến b=a//
while (a>=1) // vòng lặp này sẽ cho ta đếm số chữ số của a//
{
    a=a/10;
    i++;    // giá trị của i là số chữ số của a//
}
while(b>=1) // vòng lặp này để tìm ra số sau khi viết ngược//
{
    soMoi= (b%10)*pow(10,(i-1))+soMoi;
    i--;
    b=b/10;
}
printf("%d",soMoi);
}

mọi người ơi cho mình hỏi với ạ, khi mình viết chương trình Đảo ngược các chữ số trong 1 số . Nhưng mà khi chạy trương chình thì thấy trả ra kết quả k đúng và mình tìm được hình như có vấn đê xuất hiện ở dòng soMoi= (b%10)*pow(10,(i-1))+soMoi; mình thử pow(10,i) với i bằng 2 thì kết quả cho ra là 99 không biết thế này là bị sao ạ?

Do hàm pow() nhận tham số và trả về kiểu double nên khi tính sẽ dẫn đến sai số.

4 Likes

Một là do hàm pow làm việc với kiểu double cho nên càng tính toán thì càng bị sai số.
Hai là do hàm pow dùng một loại phương pháp tính nhanh và gần đúng để đạt tốc độ trong chớp mắt nên nó chênh lệch kết quả ngay từ đầu. (Hiện tại chưa có phương pháp tính lũy thừa với độ phức tạp hằng số).

6 Likes

vậy cho mình hỏi cách khắc phục đc k ạ?

Bạn phải tự viết một hàm pow của riêng bạn thôi.

5 Likes

ok cảm ơn b nha…

Bài này dùng sơ đồ Horner là đẹp :smiley:

Thay vì dùng pow thì bạn giữ một biến pow10 và nhân 10 nó lên.

4 Likes

horner là gì bạn, mình mới học nên k biết

3 Likes

Đó là đổi cơ số. Còn bài của thớt là đảo ngược số. :slight_smile:

Thấy cách của thớt cầu kỳ quá. Chỉ vài đòn cơ bản thế này là được rồi. :point_down:

#include <stdio.h>

int main() {
    int a = 0, b = 0;
    scanf("%d", &a);
    while (a != 0) {
        b = b * 10 + a % 10;
        a /= 10;
    }
    printf("\n%d\n", b);
    return 0;
}
2 Likes

Đó là tựa đề topic chứ ko phải nội dung của post.
Mà đoạn này sử dụng sơ đồ Horner mà :smiley:

Số mà ko đi với cơ số thì cũng như đa thức thôi :smiley:

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