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
Bài liên quan
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’
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.
Cách đó viết trong C++ nhìn thấy ghê
biểu thức nó là
(x + k) % 'Z' + 'A'
em vẫn chưa hiểu lắm, ac giải thích kĩ hơn một tí được không
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ớiTuDien[15]
Nhập số đơn vị thứ n là
int n
, giả sửn = 4
chẳng hạnThì 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)
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).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.
a có thể giải thích rõ biểu thức ‘A’ + (x - ‘A’ + k) % 26 được không ạ
Đây là một phần bảng mã ASCII các ký tự trong tiếng Anh
![](/pictures/picfullsizes/2018/10/01/sqo1538410866.png)
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 ).
cảm ơn a giải thích chi tiết ạ.
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