01/10/2018, 08:16

In kí tự n đơn vị sau kí tự được nhập

AC hướng dẫn giúp em cách để in ra kí tự thứ n sau kí tự được nhập, trong khoản từ A - Z.
Làm sao mình có thể tạo thành vòng tròn A đến Z. Ví dụ khi nhập sau Z 2 đơn vị thì được ký tự B.
Em cảm ơn

rogp10 viết 10:17 ngày 01/10/2018

Viết mã Caesar à

Cho 1 ánh xạ f: [a - z][A - Z] -> Z/26Z (với phép cộng mod 26). Cộng xong rồi đổi lại thôi bạn.

f: x -> x - ‘A’ với ‘A’ <= x <= ‘Z’

Nguyễn Duy Hùng viết 10:23 ngày 01/10/2018

String Chars = “ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
sau khi nhận được kí tự nhập vào rồi thì tìm vị trí của nó trong chuỗi Chars, rồi xuất ra Chars.charAt((Chars.indexOf(Input)+n)%26) với Input là kí tự nhập vào còn n là vị trí của ký tự sau Input, tất nhiên cũng phải nhập n. Không biết đúng ý bạn chưa nhỉ. Cái này là code Java nhé, mình quên mất C++ nó làm sao rồi.

rogp10 viết 10:29 ngày 01/10/2018

Cách đó viết trong C++ nhìn thấy ghê

biểu thức nó là (x + k) % 'Z' + 'A'

The Sao viết 10:25 ngày 01/10/2018

em vẫn chưa hiểu lắm, ac giải thích kĩ hơn một tí được không

Trần Hoàn viết 10:30 ngày 01/10/2018

Thuật toán nhé:
Bạn tạo một mảng char[26] TuDien = {A,B,C...Z} => TuDien[0]==A, TuDien[1]==B,… TuDien[25]==Z
Nhập kí tự char kitu1, giả sử kitu1 = 'P' chẳng hạn => P ứng với TuDien[15]
Nhập số đơn vị thứ n là int n, giả sử n = 4 chẳng hạn
Thì kí tự cần in ra sẽ là TuDien[(15+4)%26] hay là TuDien[19] hay là ‘T’

(% tức là kết quả số dư trong phép chia nguyên ấy)

rogp10 viết 10:23 ngày 01/10/2018

C nó có sẵn cái map của bạn rồi

Trong ASCII thì ‘A’ tới ‘Z’ là 1 dãy 26 con số liên tiếp. Nếu bạn muốn map ‘A’ tới ‘Z’ vào [0…25] thì chỉ cần:
x -> x - 'A'
Giờ phải cộng thêm k vào rồi lấy mod (x - 'A' + k) % 26
Bây giờ muốn map trở lại thì cộng thêm ‘A’: 'A' + (x - 'A' + k) % 26

Vậy thì ta cần x -> 'A' + (x - 'A' + k) % 26

Có thể thay 26 bằng 'Z' - 'A' + 1 nếu không muốn để số trơ trọi (unnamed constant).

The Sao viết 10:19 ngày 01/10/2018

Cảm ơn thuật toán của a Hùng, a Toàn. A @rogp10 cho em hỏi thêm là cộng “k vào rồi lấy mod” mục đích là làm gì ạ?
Với lại tại sao chia cho 26 phần tử vậy ạ?
Em cảm ơn.

The Sao viết 10:22 ngày 01/10/2018

a có thể giải thích rõ biểu thức ‘A’ + (x - ‘A’ + k) % 26 được không ạ

Nguyễn Duy Hùng viết 10:31 ngày 01/10/2018

Đây là một phần bảng mã ASCII các ký tự trong tiếng Anh

Trong công thức ‘A’ + (x - ‘A’ + k)%26 thì x là kí tự bạn nhập vào, k là số ký tự sau x . Vd bạn nhập vào kí tự x = H và k = 5 tra bảng ta thấy H nó bằng 72 thay vào công thức 65 + ( 72 - 65 + 5 ) %26 = 77 tra bảng ngược lại thì kí tự có mã DEC là 77 đúng không tức là M ( M đứng sau H k-1 kí tự ). còn tại sao lại mod 26 vì để giới hạn k trong khoảng từ (0 <= k <= 25 ).

The Sao viết 10:29 ngày 01/10/2018

cảm ơn a giải thích chi tiết ạ.

Mai Bá Giang Sơn viết 10:29 ngày 01/10/2018

có 2 điều e thắc mắc ạ ! 1 là e thay cái đó vào thì k ra kết quả nhưng nếu thành là ‘A’ + k thì lại đúng
Ví dụ , e nhập A là A luôn, k = 1 thì kết quả ra B, còn nếu thêm mod 26 vào thì lại ra kq khác

Bài liên quan
0