1
0

yukicoder No.18 うーさー暗号 解説

Last updated at Posted at 2024-07-23

問題文

解説

一般的にどの言語でもASCII Codeというものがある。細かく覚える必要はないが、(char)('A'+$1$)-'B'、(char)('Z'-$25$)='A'という感じで、アルファベット表みたいな感覚で文字変換ができる(ここでchar型変換をしないと、整数型になってしまうので注意)。
1文字目は(char)($s_0-1$),2文字目は(char)($s_1-2$)という感じで続けるのだが、ここで注意が必要。
まず$26$文字目以降だ。これ以降は、わざわざ$26$とか$42$とか大きな数字で引く必要はない。よって、for文を回すときは、($s_i-(i+1)mod26$)という感覚でやると割といい感じになる。なお、そのわざわざ%mod6する理由は次にある
続いて、入出力例2のパターンだ。この問題の制約下では'A'-1='Z'にしろという命令が暗にあるが、このままただ'A'-1をすると'@'になってしまう。これの対処法は、(i+1)mod26%をした後場合分けをする。$'A'\leqq s_i\leqq 'Z'$がfalseだったら**$s_i+=26$**をする。そうでなければ何もしない。これで大丈夫。

C++の解答例

#include <bits/stdc++.h>
using namespace std;

int main(){
  string s;cin>>s;
  for(int i=0;i<s.size();i++){
    s[i]=(char)(s[i]-(i+1)%26);
    if(!('A'<=s[i]&&s[i]<='Z'))s[i]+=26;
  }
  cout<<s<<endl;
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0