Skip to content

Instantly share code, notes, and snippets.

@btnguyen2k
Created November 12, 2024 05:52
Show Gist options
  • Select an option

  • Save btnguyen2k/30c84a22fbf296efb427826b3d72a2ff to your computer and use it in GitHub Desktop.

Select an option

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