Bài tập về đổi từ thập phân sang nhị phân

Mình làm ntn nhưng số nó bị ngược ko biết cách nào đảo lại cho xuôi. và nếu muốn lấy số nhị phân này gán vào 1 biến thì làm ntn???

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int thap_phan;
   int h[]= {0,1};
   printf("nhap so he thap phan can doi:");
   scanf("%d",&thap_phan);
   while (thap_phan/2)
   {
    if(thap_phan%2)
    {
        printf("%d",h[1]);
    }
    else
        {
            printf("%d",h[0]);
        }
        thap_phan /= 2;

   }
   printf("%d",thap_phan);
    return 0;
}
1 Like

dùng cả mảng ghê nhỉ :smile:
Nếu thích dùng mảng thì hãy dùng mảng đó để lưu giá trị n % 2 chứ đừng dùng mảng để lưu 0 với 1, vì nếu n % 2 thì nó cũng chỉ ra 0 với 1 thôi.

Nếu dùng mảng để lưu giá trị n % 2 thì sau này xuất ngược mảng nữa là đc.

Ngoài ra bài này còn nhiều cách làm khác, mình không nói ở đay, theo sát bài của bác thôi

Mới học mà hì. tại mình có làm cái bài chuyển sang hệ 16 bài đó cũng dùng mảng cho i chạy từ 0=>15 đẻ in ra từng phần tử trong mảng nhưng ko thành đành chuyển sang đổi hệ nhị phân cho đơn giản hơn xong nhị phân mới làm lại thập lục mà xem trên wiki nó cũng dùng mảng mà ko hiểu lắm nó viết = c++. bạn dịch qua c cho mình với đc ko?

const alpha = "0123456789ABCDEF";
 
void printinbase(long d, short b) { // in ra số ở hệ cơ số b tương ứng với số thập phân d)
  short r=d%b;
  if (d-r) printinbase(d/b,b);
  cout << alpha[r];
}

Giải thích thế này cho dễ hiểu, còn code thì bác phải tự viết lại thôi.

const là một số không thể thay đổi được. Khác với biến, ví dụ const ở trên là 0123456789ABCDEF thì const này không thể thay đổi được, không thể gán alpha = x với x là một số hay một thứ nào khác

Còn bên trên là hàm với cấu trúc void <ten ham> <khai báo dữ liệu nhập vào>, với dạng hàm này sẽ được thực thi trong khi hàm main có lời gọi hàm nó, ví dụ mình sẽ để bên duới.

Nói chung nó chỉ là 1 hàm xử lý dạng hàm gọi hàm, hay hàm chồng hàm, hay có thể gọi là đệ quy.

Đệ quy thì kiến thức rộng lắm, bác đọc thêm về đệ quy để hiểu các thao tác của đệ quy và các bước duyệt điều kiện và lưu vào stack.

còn lời gọi hàm thì sao bác xem ví dụ bên dưới:

void printinbase(long d, short b){  //code in here   }

int main(){
long a; short b;
printinbase(a, b);
}

Tất nhiên các hàm dùng dể thực hiện một công việc nào đó nhiều lần, hoặc muốn code rõ ràng thì người ta dùng hàm :smiley:

Còn các lện cout, cin thì nó cũng giống với lệnh printf hay scanf, tuy nhiên 2 lệnh cout cin nó không xét kiểu dữ liệu mà nó dùng kiểu dữ liệu sẵn có của biến được khai báo.
p/s: hàm main là một hàm đặc biêtk

mấy cái bác nói em cũng nắm sơ sơ khi xem video của anh đạt rồi.cơ mà quay lại vấn đề chính ở đầu em hỏi ý sô bị ngược in sao cho xuôi và làm sao để lấy số đó gán cho 1 biến.

1 Like

Mục đích của việc để int h[]={0.1}
với

printf ("%d",h[1]);
printf ("%d",h[0]);

để làm gì vậy cậu ?

cái đó để là : printf (“1”) và printf (“0”);
cũng đc ^^ tại bệnh làm phức tạp hóa vấn đề ấy mà ^^

Ví dụ thế này cho dễ hiểu nhé. giờ xét một số nào đó có số binary là

1 0 0 0 1 1 1

Vậy mảng chứa số đó là

1 1 1 0 0 0 1

0 1 2 3 4 5 6 // số i

vậy có phải là số đó = 10^0+10^1+10^2+10^6 (do những số 0 không tính).

Chỉ đơn giản vậy là có thể tính đc rồi :smiley: giờ xem
Đã thấy được sự liên hệ chưa?

theo sát bài chú thôi chứ đổi nhị phân ngừoi ta ko dùng cách rắc rối tthees này :smile: vì nếu binary ngàn số thfi tính theo hi vọng

1 Like

Bài tập này có nhiều cách giải lắm và nhìn cách a viết thì e k hiểu :frowning: , Trong quyển C_aptech chỉ mới dạy hàm scan và printf đã có 1 bài tập về chuyển đổi một số nguyên hệ 10 sang hệ 2 ( thập phân sang nhị phân ) k biết có cách nào làm bài đó mà chỉ dùng 2 hàm đó không ? .
Còn bài của bạn ở trên sao in ra lại bị ngược số nhỉ :
10 = 1010
Nhưng trương trình lại tính ra là 0101 …

----Đó bài này mình đang mắc ở vấn đề bị ngược nay mà thím BreakDown trả lời gì đâu ấy :v: . mình vừa mới nghĩ ra cách giải quyết đảo lại là gán nó vào 1 xâu rồi ta đảo xâu :v…

----mình cũng đọc cái C_aptech của anh Đạt có 2 lệnh scantf vs printf ta dùng %x thì đc thập lục. còn quả nhị phân thì chịu :v:

1 Like

haha, bên trên thì yêu cầu gán vào 1 biến, rồi bên dưới lại bảo gán vào xâu. Nếu gán vào xâu thì đó khác gì mảng

P/s: nếu không đọc kỹ nội dung tôi giải thích từ đầu thì đừng bảo tôi trả lời gì đâu :smile:

1 Like

A chỉ cách gán vào 1 biến hả ^^, sr e gà nên nhìn k ra :smiley:

Chính xác, nếu em đọc lại từ trên xuống dưới thì cái giải thích của a đã là:

Nếu dùng mảng để lưu giá trị n % 2 thì sau này xuất ngược mảng nữa là đc.

Rồi sau đó chủ thread lại yêu cầu gán trị binary đó vào biến, vậy nên a mới hướng dẫn bên dưới.

Rồi kết thúc thì lại trở ngược lại về cái giải thích đầu tiên bên trên :smile:

Mình QOUTE lai nhé

mấy cái bác nói em cũng nắm sơ sơ khi xem video của anh đạt rồi.cơ mà quay lại vấn đề chính ở đầu em hỏi ý sô bị ngược in sao cho xuôi và làm sao để lấy số đó gán cho 1 biến.

Thì chả phải gán vào biến rồi xuất nó ra là đc sao. muốn yêu cầu gì nữa =))

1 Like

Có phải bạn cần cái này?

int main()
{
	int n, A[1000], i, j = 0;

	scanf("%d", &n)

	while (n != 0){
		A[j] = n % 2;
		n /= 2;
		j++;
	}
	for (int k = j - 1; k >= 0; k--){
		printf("%d", A[k]);
	}
}
2 Likes

haha, e gà quá nên nhìn k ra, cứ tập trung ở chỗ sao nó ra ngược mà k đọc hết :grin:

—Vẫn chữa “Ngộ” đc ý của thím breakdown muốn nói gì.@@
— thứ nhất là mình muốn sau khi in đc ra số nhị phân ta gán số đó cho 1 biến như thế nào và có đc ko?
—thứ 2 mình có ghi rõ là tìm ra cách để ĐẢO NGƯỢC lại.
— thứ 3 là em thấy bác nói không sát vấn đề em hỏi cho lắm mà em thấy mấy cái bác bác nói lan man em có cảm giác như bác đang khẳng định mình biết rộng biết nhiều hơn là cố gắng cho em hiểu.
-có lẽ do em ngu dốt nên không hiểu đc ý nghĩ sâu xa của những lời bác nói nên em suy nghĩ vậy có gì không phải mong bác bỏ qua.

Tới đây hiểu nhau hơn rồi nhé:
những chỗ em chưa hiểu trong lời giải thích của bác là:

–Chỗ này bác cho xin 1 ví dụ nho nhỏ về “suất ngược mảng nữa đc” với em chưa hình dung ra đc mảng nữa là mảng gì như thế nào.

– Chỗ này thì bác giải thích cho em tại sao mảng chứa nó lại là như vậy có phải đây là cái mảng khi em in ra bị ngược đây ko?? :neutral_face: tại sao
10^0+10^1+10^2+0^3+0^4+0^5+10^6 =đúng số nhị phân đó :dizzy_face:

**

-Em mới bắt đầu học mong các anh chị đàn anh đi trc chỉ giáo, với em cũng ngu dốt nữa nên anh anh chị nói mấy cái sơ cấp thôi ạ. em cảm ơn bác nhiều

haha, tôi chịu cậu rồi :smile:

Xuất xuôi là xuất từ 0 tới đâu đó, còn xuất ngược là xuất từ đâu đó về 0. Nếu cậu chưa biết đc xuất mảng ra sao thì đừng dùng mảng vào bài. Hoặc cũng đừng nên đụng tới xâu (string).
Còn %2 thì nó chỉ có 2 trạng thái 1 là chia hết (%2 = 0) và chia dư (%2 = 1).

Còn cậu bảo cần in ra số nhị phân và GÁN nó vào 1 biến nào đó. Tôi giải thích rõ thuật toán bên trên, vậy cậu đã câm đc máy tính và bấm 10^0+10^1+10^2+10^6 chưa? Huh?

Nếu cậu cần code thì tôi không phải là người sẽ giúp cậu.

Do ngu hay dốt nên người ta mới mở trường, mới in sách và mới cần người dạy.

Vậy thì đừng nên nói gì cả. HaHa.

1 Like

tôi giải thích thêm về mảng tai sao nó lại như vậy nhé.

Khi vòng lặp cậu %2 thì máy tính nó sẽ xuát là binary bị ngược( ví dụ chung ở đây là 8, bin là 1000) thì máy sẽ xuất ra 0001.

Nếu cậu lưu các giá trị này vào 1 mảng, ở đây là arr[i] thì có phải giá trị lưu được sẽ là arr[i] ={0, 0, 0, 1} (nếu muốn chắc thì có thể kiểm tra lại và đó là vì sao tôi bảo xuất ngược sẽ là 1000).

Còn gán số thì thuật toán bên trên làm đc, nhưng không làm đc với số vĩ đại.

1 Like

cái đoạn thuật toán kia em hiểu rồi nhưng tại sao khi đảo ngược lại só nhị phân và lây 10^i+ vào lạ ra đúng số đó.
cái gán %2 cũng hiểu là chỉ có 0 và 1 nhương số nào sẽ là vị trí 0 cái nào là vị trí 1 trong mảng. huh :v:

ví dụ thế này

while(n/2)
{
arr[i]=n%2;
i++;
}

n là số thập phân, còn tại sao nó lưu đc vào mảng với giá trị như thế thì suy nghĩ đi :-1: hoặc tự bật máy tính lên rồi debug

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