Không tìm được lỗi trong chương trình chuyển đổi số thập phân sang số nhị phân và ngược lại

Xin chào. Mình có làm 1 đoạn code nhỏ để cho người dùng nhập vào một số thập phân và chuyển nó sang số nhị phân.
Nhưng có 1 điều vô lý là chương trình mình có giới hạn hay sao ấy? Nó chỉ cho kết quả đúng khi số nhập vào phải từ 0 => 1023. Còn khi nhập 1024 thì nó cho kết quả sai :frowning:
Dưới đây là code:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#include <Windows.h>
void DecimalBinary(int n);
void BinaryDecimal(int m);
int power(int coso, int somu);
int power(int coso, int somu)
{
    int ketqua = 1;
    for (int i = 1; i <= somu; i++)
        ketqua*=coso;
    return ketqua;
}
void DecimalBinary(int n)
{
    if (n == 0)
        printf("Ketqua: 0\n");
    else
    {
        int bienphu = 0;
        int a[50];
        int i = 0;
        while (n != 0)
        {
            int digit = n%2;
            n/=2;
            a[i++] = digit;
            bienphu++;
        }
        printf("Ket qua: ");
        for (int x = bienphu-1; x >= 0; x--)
            printf("%d",a[x]);
        printf("\n");
    }
}
void BinaryDecimal(int m)
{
    int tong = 0;
    int chuso = log10(m)+1;
    if (m == 0)
        printf("Ketqua: 0\n");
    else
    {
        for (int i = 0; i < chuso; i++)
        {
            int sochu = m%10;
            m/=10;
            tong+=sochu*power(2,i);
        }
        printf("Ketqua: %d\n",tong);
    }
}
int main()
{
    int n;
    printf("Nhap so can doi sang he nhi phan: ");
    scanf("%d",&n);
    DecimalBinary(n);
    int m;
    printf("\nNhap so can doi sang he thap phan: ");
    scanf("%d",&m);
    BinaryDecimal(m);
    getch();
    return 0;
}

Để dễ kiểm chứng thì mình làm thêm cái hàm đổi ngược lại số nhị phân sang số thập phân. Để khi nhập 1 số thập phân rồi sau đó nhập số nhị phân để kiểm tra lại nhưng từ số 1024 trở đi thì bị lỗi.
Ai giúp mình nhé! Xin cảm ơn!

1 Like

Input hệ 2 bị tràn rồi.
như 1024 = 10 000 000 000 (10 tỷ)
nhưng kiểu int max là 2^31 thôi tức cỡ 2,1 tỷ :smile:
Còn 1023 thì là 1 111 111 111 tức < 2,1 tỷ -> vẫn ok

-> Có thể dùng chuỗi để lưu trữ

4 Likes

Nhưng hệ 2 là ở hàm chuyển Binary sang Decimal mà anh? Nếu có tràn thì chỉ tràn ở hàm chuyển Binary sang Decimal thôi chứ nhỉ? Còn hàm Decimal sang Binary thì không có hệ 2 mà chỉ liên tục lấy chữ số cuối cùng thôi mà (nhưng vẫn sai)?
P/S: Em còn non nên nhiều cái chưa hiểu :slight_smile:

2 Likes

Thì mình đang nói cái hệ 2 sang 10 á.
void BinaryDecimal(int m)

-> Khi bạn input hệ 2 có phải bạn nhập 101010101
Như 1024 = 10 000 000 000 (viết tách theo hệ 10 cho dễ nhìn) = 10 tỷ
-> Lớn hơn giá trị tối đa có thể lưu của int.
Vì kiểu int lưu trữ ở hệ 10. Tức bạn nhập 10101010 thì nó vẫn hiểu 10101010 của hệ 10 chứ không phải hệ 2.
Nên khi bạn nhập 10 000 000 000 thì C hiểu là 10 tỷ. Chứ ko phải là 1024. :grin:

À mà hàm hệ 10 sang hệ 2 mình test thấy ok mà nhỉ :stuck_out_tongue:

3 Likes

À, đúng rồi. Cái hàm void DecimalBinary(int n) nó hoàn toàn đúng, chuyển không sai, có lẽ mình tính tay lộn :smiley:
Chỉ có cái hàm void BinaryDecimal(int m) là sai thôi :slight_smile:

Vậy thì có cách nào để C hiểu đó là số dạng binary không bạn? :)[quote=“drgnz, post:2, topic:25797”]
-> Có thể dùng chuỗi để lưu trữ
[/quote]

Mình không hiểu rõ cách này lắm :smiley: Bạn có thể cho mình cái link tham khảo hoặc hướng dẫn trực tiếp cho mình không :slight_smile:

3 Likes

Trong C thì theo mình biết ko có cách nào lưu trữ dưới dạng binary với kiểu primitive. :c
Nhưng dùng chuỗi là vầy

char number[64]; //64bit
gets(number);
bintodec(number);

int bintodec(char number[64]) {
 int i = strlen(number)-1;
 int size = i;
 int result = 0;
 for(;i >= 0; i--) {
  //muốn đổi ký tự số sang số thì trừ đi ký tự số 0
  result += (number[i] - '0')*luythua(2,size-i);
 }
 return result;
}

(code chưa test nhưng ý tưởng là vậy :)) )

3 Likes

Bạn tham khảo nhé

#include <iostream>
#include <conio.h>
using namespace std;
int dec_tobin(int bits[], int max, int num);
const int MAX = 32;
int main()
{
	int bits[MAX] = { 0 };
	int num;
	cout << "Enter a decimal value to convert: ";
	cin >> num;
	int size = dec_tobin(bits, MAX, num);
	for (int i = size - 1; i >= 0; i--)
		cout << bits[i];
	cout << "\nPress any key to continue.";
	_getch();
	return 0;
}
int dec_tobin(int bits[], int max, int num)
{
	int i = 0;
	do
	{
		bits[i] = num % 2;
		num /= 2;
		i++;
	} while (num > 0);
	return i;
}
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?