Chuyển thập phân sang nhị phân sai

Mình viết chương trình chuyển đổi giữa hệ nhị phân sang thập phân và ngược lại không sử dụng array với string. ( Mình kết hợp 2 bài toán trong 1 file và có menu chọn ) . Ở phần DectoBin khi mình test những số nhỏ nhỏ kết quả vẫn đúng, nhưng khi test mấy số như 12, 16 trở lên kết quả ra sai. VD 16 ra 9999 thay vì 10000. Mọi người giải thích cho mình với ạ!

image

Đây là code của mình:

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

void DectoBin();
void BintoDec();
bool isBin(int n);
void Menu(){
    printf("\n===CHUYEN DOI GIUA THAP PHAN VA NHI PHAN===\n");
    printf("\t1, Thap phan ==> Nhi phan.\n");
    printf("\t2, Nhi phan  ==> Thap phan.\n");
    printf("\t3, Exit.\n");
    int select;
    scanf("%d",&select);
    switch (select)
    {
    case 1:
        DectoBin();
        break;
    case 2:
        BintoDec();
        break;
    default:
        printf("\nExitting program......\n");
        printf("\nThank you ^^! - Nhat dep trai <3 \n");
        getch();
        exit(0);
    }
}

void DectoBin(){
    printf("\n==CHUYEN TU THAP PHAN SANG NHI PHAN==\n");
    int n;
    printf("Nhap so can chuyen doi: ");
    scanf("%d",&n);
    if (n<0) n = -n;
    int i = 0; long long ans = 0;
    while (n){
        ans += (n%2) * pow(10,i); 
        ++i;
        n /= 2;
    }
    printf("So sau khi chuyen doi la: %lli\n",ans);
    Menu();
}

void BintoDec(){
    long long n;
    printf("\n==CHUYEN TU NHI PHAN SANG THAP PHAN==\n");
    do{
        printf("Nhap so can chuyen: ");
        scanf("%lli",&n);
        if (isBin(n) == false)
        printf("%lli khong phai so nhi phan!\n",n);
    } while (isBin(n) == false);
    int ans = 0, i = 0;
    while (n){
        ans += (n%10)*pow(2,i);
        n /= 10;
        ++i;
    }
    printf("So sau khi chuyen doi la: %d\n",ans);
    Menu();
}

bool isBin(int n){
    while (n){
        if ((n%10)!=1&&(n%10)!=0)
        return false;
        n /= 10;
    }
    return true;
}

int main(){
    Menu();
}

Cảm ơn mọi người nhiều ạ!

Hàm pow() không chính xác cho số nguyên đâu bạn, mà chuyển từ thập phân sang nhị phân không nên lưu kết quả lại dưới dạng số nguyên mà lưu dưới dạng string.

Ví dụ: Chuyển 262155 sang nhị phân, code của bạn sẽ ra kết quả sai.

3 Likes

Cảm ơn bác! Thì em đang làm bài tập không dùng string mà bác :smiley:!
Vậy chắc phải làm một hàm luỹ thừa khác phải không bác?

Gõ vào [10, 100, 1000, …] :smiley: chứ sao.

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