Bài này xin hướng dẫn các bạn cách chuyển cơ số 10 sang cơ số 8 và ngược lại. Bài viết sẽ hướng dẫn chi tiết ý tưởng và cung cấp lời giải tham khảo sử dụng cấu trúc dữ liệu ngăn xếp.
Chuyển cơ số 10 sang cơ số 8
Cũng giống như cách chuyển đổi cơ số từ thập phân sang nhị phân, để chuyển cơ số 10 sang cơ số 8 ta cũng phải thực hiện lưu lại kết quả chia dư số ở hệ thập phân cho 8, sau đó chia số đó cho 8. Cứ lặp lại chừng nào số cần chuyển còn lớn hơn 1.
VD: Chuyển số 2764 (hệ thập phân) sang hệ bác phân?
2764 chia 8 = 345.5 (345 -> dư 4)
345 chia 8 = 43.125 (43 -> dư 1)
43 chia 8 = 5.375 ( 5 -> dư 3)
5 chia 8 = 0 -> dư 5
Như vậy, để lấy 2764 ở hệ bát phân, ta đảo ngược các số dư từ cuối lên đầu, tức 2746(10) = 5314(8).
Lời giải tham khảo sử dụng stack:
#include <stdio.h> #include <stack> std::stack<int> Dec2Oct(int num, int base){ std::stack<int> oct; while(num > 1){ oct.push(num % base); num /= base; } return oct; } int main(){ int n; printf("nNhap so o co so 10 can chuyen: "); scanf("%d", &n); printf("nSo %d o co so 8 la: ", n); std::stack<int> oct = Dec2Oct(n, 8); while(!oct.empty()){ printf("%d", oct.top()); oct.pop(); } }
Với cách này bạn có thể chuyển từ cơ số 10 sang một hệ cơ số bất kỳ nào khác chứ không chỉ cơ số 8. Nếu bạn không muốn dùng stack, hãy thử cách sử dụng vector sau đây:
#include <stdio.h> #include <math.h> #include <vector> std::vector<int> Dec2Oct(int num){ std::vector<int> oct; while(num > 1){ oct.push_back(num % 8); num = num / 8; } return oct; } int main(){ int n; printf("nNhap so o co so 10 can chuyen: "); scanf("%d", &n); printf("nSo %d o co so 8 la: ", n); std::vector<int> oct = Dec2Oct(n); for(int i = oct.size() - 1; i >= 0; --i){ printf("%d", oct[i]); } }
Kết quả chạy:
Nhap so o co so 10 can chuyen: 2764 So 2764 o co so 8 la: 5314
Chuyển cơ số 8 sang cơ số 10
Việc chuyển từ cơ số 8 sang cơ số 10 hết sức đơn giản. Tổng của số hàng đơn vị ở cơ số 8 sẽ nhân với 8^0, số hàng chục * 8^1, … chính là cơ số 10 của số cần chuyển. Lấy một ví dụ cụ thể như sau:
Đổi 2764(8) = ?(10), ta làm như sau:
2764(8) = 4*8^0 + 6*8^1 + 7*8^2 + 2*8^3 = 1524(10).
Bạn có thể kiểm tra bằng cách chuyển ngược kết quả về cơ số 8 sử dụng chương trình phía trên.
Lời giải tham full khảo:
#include <stdio.h> #include <math.h> #include <vector> std::vector<int> Dec2Oct(int num){ std::vector<int> oct; while(num > 1){ oct.push_back(num % 8); num = num / 8; } return oct; } int Oct2Dec(std::vector<int> oct){ int val = 0; int len = oct.size(); int p = 0; for(int i = 0; i < len; ++i){ val = val + oct[i] * pow(8, p); p = p + 1; } return val; } int main(){ int n; printf("nNhap so o co so 10 can chuyen: "); scanf("%d", &n); printf("nSo %d o co so 8 la: ", n); std::vector<int> oct = Dec2Oct(n); for(int i = oct.size() - 1; i >= 0; --i){ printf("%d", oct[i]); } printf("n"); printf("Convert nguoc ve co so 10 = %d", Oct2Dec(oct)); }
Kết quả chạy:
Nhap so o co so 10 can chuyen: 2764 So 2764 o co so 8 la: 5314 Convert nguoc ve co so 10 = 2764
Để lại một bình luận