Created
November 12, 2024 05:52
-
-
Save btnguyen2k/30c84a22fbf296efb427826b3d72a2ff to your computer and use it in GitHub Desktop.
[C] Chuyển số thập nhân sang cơ số 32 - http://goclaptrinh.io/cms/beginner/c-cpp-crockford-base32-numbers/
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <ctype.h> | |
| int nhapSoThapPhan() { | |
| int n; | |
| printf("Nhập số thập phân: "); | |
| scanf("%d", &n); | |
| return n; | |
| } | |
| char* nhapSoBase32() { | |
| char* s = (char*)malloc(100); | |
| printf("Nhập số ở hệ cơ số 32 (bảng mã Crockford Base32): "); | |
| scanf("%s", s); | |
| return s; | |
| } | |
| // đảo ngược 1 chuỗi | |
| char* daoChuoi(char* str) { | |
| int n = strlen(str); // lấy độ dài của chuỗi | |
| for (int i = 0; i < n / 2; i++) { | |
| char temp = str[i]; | |
| str[i] = str[n - i - 1]; | |
| str[n - i - 1] = temp; | |
| } | |
| return str; | |
| } | |
| // đổi số thập phân sang cơ số 32 | |
| char* doiSangBase32(int n) { | |
| char base32[] = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"; | |
| char* ketqua = (char*)malloc(16+1); // cấp phát tối đa 16 ký tự + ký tự \0 kết thúc | |
| // convert to base32 | |
| int i = 0; | |
| while (n > 0) { | |
| ketqua[i++] = base32[n % 32]; | |
| n /= 32; | |
| } | |
| ketqua[i] = '\0'; | |
| return daoChuoi(ketqua); | |
| } | |
| // chuyển 1 ký tự sang số | |
| int charToNum(char c) { | |
| c = toupper(c); // chuyển thành ký tự in hoa | |
| switch (c) { | |
| // theo qui định của bảng mã Crockford, chấp nhận ký tự I và L, nhưng chuyển thành số 1 | |
| case 'I': case 'L': | |
| c = '1'; | |
| break; | |
| // theo qui định của bảng mã Crockford, chấp nhận ký tự O, nhưng chuyển thành số 0 | |
| case 'O': | |
| c = '0'; | |
| break; | |
| // theo qui định của bảng mã Crockford, chấp nhận ký tự U, nhưng chuyển thành V | |
| case 'U': | |
| c = 'V'; | |
| break; | |
| } | |
| char base32[] = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"; | |
| for (int i = 0; i < 32; i++) { | |
| if (c == base32[i]) return i; | |
| } | |
| return -1; | |
| } | |
| // chuyển số ở hệ cơ số 32 sang thập phân | |
| int doiSangThapPhan(char* s) { | |
| int n = 0; | |
| for (int i = 0; s[i] != '\0'; i++) { | |
| int num = charToNum(s[i]); | |
| if (num == -1) return -1; // có ký tự không hợp lệ! | |
| n = n * 32 + num; | |
| } | |
| return n; | |
| } | |
| int main() { | |
| int n = nhapSoThapPhan(); | |
| printf("Số thập phân %d chuyển sang hệ cơ số 32: %s\n", n, doiSangBase32(n)); | |
| char* s = nhapSoBase32(); | |
| printf("Số ở hệ cơ số 32 [%s] chuyển sang thập phân: %d\n", s, doiSangThapPhan(s)); | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment