Nhờ giúp rút gọn 1 chuỗi số.
Em có một chuổi số gồm 10 số muốn rút gọn lại thành chuỗi số chỉ còn 4 số. Với điều kiện các chuổi 10 số khác nhau thì rút gọn lại thành chuỗi 4 sốcũng không bị trùng nhau.
Ví dụ 0912345678; 0934876546;… Mục đích của em là rút gọn dãy số điện thoại đó ah. Ra một dãy gồm 5 số hoặc là 5 ký tự cũng được.
Không biết có cách nào giải quyết không ah. Mong các cao thủ giúp với. Em cảm ơn.
0912345678 –> ra thành số có 4 con số gì?
0934876546 –> ra thành số có 4 con số gì?
Sao bạn không đánh vào file gửi lên chừng chục số và các ví dụ về kết quả mong muốn của mình, để dễ hiểu hơn không!?
Thân
CÓ thế dùng thuật toán crypto tính checksum CRCxxx
Chơi cái này cũng vui!
Giải pháp: ngắt 10 chữ số thành 5 phần, mỗi phần 2 chữ số, tức chỉ cần mã hóa 100 con số từ số 00 đến số 99 là xong.
Cột A: chứa chữ số từ 00 đến 99
Cột B: chứa các ký tự thay thế.
Côt E: ghi số điện thoại hoc sinh muốn "mã hóa" 🙂
Dùng hàm tự tạo JoinText() của thầy @ndu96081631, cụ thể như sau:
F2=JoinText("",VLOOKUP(T(IF({1},MID(E2,{1,3,5,7,9},2))),$A$2:$B$100,2,))
G2=IF(F2="","",TEXT(SUM(IFERROR(FIND(MID(F2,{1,2,3,4,5},1),$B$2:$B$100)*10^{8,6,4,2,0}*(ROW($1:$100)-1),)),REPT("0",10)))
Kết thúc bằng Ctrl+shift+Enter.
Thân
www.giaiphapexcel.com/diendan/threads/nh%E1%BB%9D-gi%C3%BAp-r%C3%BAt-g%E1%BB%8Dn-1-chu%E1%BB%97i-s%E1%BB%91.143707/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Chủ thớt copy đoạn code này về dùng thử:
Giả sử A1 là số đt, bạn gõ vào B1 (hay cell bất kỳ bạn muốn): =CalcCRC16(A1),
"Có.…" rồi gì nữa bạn? 🙂
Làm cho vui mà!
Thực ra, bảng mã này bạn có thể tự chế biến theo ý mình, ví dụ: nếu bạn không thích những ký tự nho nhỏ như: "'.,'"… thì bạn có thể thay bằng số 0->9 (như file kèm). Khi có bảng mã thì "Đổi ngược" hay "Đổi xuôi" tùy ý mình,
"Tự do tự tại không bị ràng buộc" hợp với bản tính của tôi.
Thân
Chưa thể hiểu cái bản bạn đưa ra. Mong bạn giải thích thêm
Mình vừa tìm ra 1 cách khác, đơn giản hơn, dùng chính lớp Dictionary. Đọc source C/C++ của nó (scrrun.dll) phát hiện ra.
Dictionary có 1 hidden property tên là "HashVal", method trong source C/C++ là get_HashVal. Mục đích nó là sinh mã băm (hash value) cho Key property. Chúng ta có thể gọi nó qua hàm CallByName của VB/VBA.
Mã băm này không trùng nhau cho các key khác nhau, là duy nhất.
Bạn chủ thớt có thể dùng hàm nay tương tự như hàm CalcCRC16 ở trên.
Source code C/C++ của HashVal property trong scrrun.dll
1. Vì ban đầu chủ thớt đã yêu cầu 4 chữ số nên tôi mới dùng CRC16, và biết là có thể sẽ xảy ra trùng CRC. Tôi đã nói trước. Dùng CRC32 hay CRC64 sẽ không trùng nhưng lại không đúng yêu cầu của chủ thớt.
2. Nhanh nhẩu đoản, tưởng tìm ra bug của scrrun.dll, hì hì, nhưng không phải. HashVal chỉ là 1 phần trong bảng băm của dictionary. Source của lớp Dictionary và method Exists có thể xem ở đây:
[URL='doxygen.reactos.org/d9/dd2/dll_2win32_2scrrun_2dictionary_8c.html#ad59ed79b09147d52ae2b660025011f07']ReactOS: dll/win32/scrrun/dictionary.c File Reference
Vậy thì không dùng cách HashVal được. Chủ thớt bỏ đi.
Tui dùng đt 10 số trước giờ nên không để ý, với đt 12 số, 13 số… sau này, bắt đầu từ mấy tới mấy vậy các bác, để tui test luôn, có thể chuyển qua CRC32
Đúng là ngớ ngẩn thiệt, cứ đi tìm giải pháp đao to búa lớn. Bản thân 1 số nó đã là duy nhất, thì chỉ cần đổi base cho nó nó thành biểu diễn ít ký tự hơn thì nó vẫn là duy nhất. Nên đổi base quách là xong
Có các base từ 2 (nhị phân) tới 10 (decimal) tới 16 (hex) tới 36, là phổ biến nhất. Tôi thử với nhiều base rồi, chọn base 36 vì nó cho ra nhiều nhất là 6 ký tự với dãy số đt 10 số hiện nay. Chủ thớt mà đòi 4 hay nhỏ hơn thì cu anh tui thua 😉
Trang web để các bạn thử đổi base:
http://www.unitconverters.net/numbers-converter.html
Từ Excel 2013 trở lên đã có hàm BASE này, nếu chủ thớt dùng Excel2013 thì dùng Base(x, 36) để đổi qua Base 36 value, và Decimal để đổi ngược lại.
Nếu chủ thớt dùng Excel nhỏ hơn 2013 thì dùng hàm copy từ Gú gồ của tui. Đổi ngược lại thì chủ thớt tự viết nhé 🙂
Xin xem file đính kèm.
The end.