30/09/2018, 20:46

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
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
");
    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("
");
    }
}
void BinaryDecimal(int m)
{
    int tong = 0;
    int chuso = log10(m)+1;
    if (m == 0)
        printf("Ketqua: 0
");
    else
    {
        for (int i = 0; i < chuso; i++)
        {
            int sochu = m%10;
            m/=10;
            tong+=sochu*power(2,i);
        }
        printf("Ketqua: %d
",tong);
    }
}
int main()
{
    int n;
    printf("Nhap so can doi sang he nhi phan: ");
    scanf("%d",&n);
    DecimalBinary(n);
    int m;
    printf("
Nhap 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!

*grab popcorn* viết 22:52 ngày 30/09/2018

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ỷ
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ữ

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

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

*grab popcorn* viết 22:47 ngày 30/09/2018

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.

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

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

À, đú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
Chỉ có cái hàm void BinaryDecimal(int m) là sai thôi

Nên khi bạn nhập 10 000 000 000 thì C hiểu là 10 tỷ. Chứ ko phải là 1024.

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 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

*grab popcorn* viết 23:02 ngày 30/09/2018

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 :)) )

Phan Dai viết 22:55 ngày 30/09/2018

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;
}
Bài liên quan
0