Chương trình chuyển số thập phân sang nhị phân bị lỗi với số âm

Em muốn tạo một chương trình chuyển số thập phân sang nhị phân nên vì vậy em tạo mảng động để linh hoạt trong việc đổi bit và chuẩn hóa cho 2 mảng bằng nhau nhưng em lại gặp vấn đề ngay hàm chuẩn hóa khi nhập -9 , -56 thì nó lại bị lỗi em ko biết phải làm sao nữa mong các cao nhân chỉ bảo :slight_smile:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

//====================== Nguyen Ham ==========
void chuyenTP_NP(int a[], int x, int n);
void in_Mang(int a[], int n);
void taoMangRong(int a[], int n);
void kt_Bit(int &n, int x); //dùng để xđ số bit cần dùng cho mảng 
void chuanHoaMang(int a[], int b[], int &n, int &m, int x);
void themMotKiTu(int a[], int n, int vitri, int x);
//============================================



//============ HAM MAIN ===============

void main()
{
	int *A, *B, *C;
	int n, m, len;
	int a, b;
	printf("Nhap vao hai so a va b :");
	scanf_s("%d%d" ,&a,&b);
	kt_Bit(n ,a);
	A = (int *)malloc(n * sizeof(int));
	kt_Bit(m, b);
	B = (int *)malloc(m * sizeof(int));
	chuyenTP_NP(A, a, n);
	chuyenTP_NP(B, b, m);
	chuanHoaMang(A, B, n, m, 0);
	printf("\nNhi phan a : ");
	in_Mang(A, n);
	printf("\nNhi phan b : ");
	in_Mang(B, m);
	/*int tong = a + b;
	kt_Bit(len, tong);
	C = (int *)malloc(len * sizeof(int));
	cong_NP(A, B, C, n, len);
	printf("\n\nTong 2 so nhi phan: ");
	in_Mang(C, len);*/
	free(A);
	free(B);
	/*free(C);*/
	_getch();
}
//=====================================

void taoMangRong(int a[], int n)
{
	int i;
	for (i = 0; i < n; i++)
	{
		a[i] = 0;
	}
}


void themMotKiTu(int a[], int n, int vitri, int x)
{
	a = (int *)realloc(a, (n + 1) * sizeof(int));
	a[vitri] = x;

}

void chuanHoaMang(int a[], int b[], int &n, int &m, int x)
{
	
	if (n > m)
	{
		if (b[m - 1] == 1)
		{
			x = 1;
		}
		for (int i = m; i < n; i++)
		{
			themMotKiTu(b, m, i, x);
			m++;
		}
	}
	else 
	{
		if (a[n - 1] == 1)
		{
			x = 1;
		}
		for (int i = n; i < m; i++)
		{
			themMotKiTu(a, n, i, x);
			n++;
		}
	}
	
}

void kt_Bit(int &n, int x)
{
	int i = 4;
	int j = 2;
	while (true)
	{
		int p1 = -pow((double)j, i - 1);
		int p2 = pow((double)j, i - 1) - 1;
		if (x >= p1 && x <= p2)
		{
			n = i;
			return;
		}
		i++;
	}
}


void chuyen_SoAm(int a[], int n)
{
	int nho = 0;
	for (int i = 0; i < n; i++)
	{
		if (a[i] == 1)
		{
			a[i] = 0;
		}
		else if (a[i] == 0)
		{
			a[i] = 1;
		}
	}
	int x = a[0] + 1;
	nho = x / 2;
	x %= 2;
	a[0] = x;
	if (nho != 0)
	{
		for (int i = 1; i < n; i++)
		{
			int x = a[i] + nho;
			nho = x / 2;
			x %= 2;
			a[i] = x;
		}
	}
}


void chuyenTP_NP(int a[] , int x, int n)
{
	int tmp = x;
	if (x < 0)
	{
		x *= -1;
	}
	int i = 0;
	taoMangRong(a,n);
	while (x != 0)
	{
		a[i] = x % 2;
		x /= 2;
		i++;
	}
	if (tmp < 0)
	{
		chuyen_SoAm(a, n);
	}
}

Viết C++ mà toàn dùng thư viện của C à?

Ý bạn là khi nhập số âm thì có vấn đề?

3 Likes

Nhập số âm vẫn đc chỉ có một vài trường hợp như -9,-56 thì bị lỗi nhưng mình nhập -56, -9thì vẫn chạy đc :((

Bạn tìm hiểu phép toán bit sẽ nhanh hơn đấy.

Mà đây có dùng tham chiếu trong gọi hàm nên là C++.

1 Like

Có một hàm bạn thay đổi con trỏ nhưng lại không đặt đó là tham chiếu. Vả lại -56 đó chtr cũng ko biểu diễn đúng bù 2, chỉ có -9 là đúng.

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