Loading

题解:B4563 [山东省小学组体验营 2026] 星际密信

题目大意

给出一个字符串,对字符串进行加密,方式如下:

  1. 对于每个英文字母(大写),将它替换为字母表中向后移动 \(k\) 位的字母(循环)。
  2. 对于数字字符,保持不变。
    容易想到对于每个字符考虑是否是英文字符,如果是就对字符进行操作,不是就跳过。

实现细节

首先考虑 \(k\) 为负数的情况,只需要加上 \(10^9\times 26\)(需要开 long long),然后 \(k \bmod 26\) 即可转化为正数的情况。
对于一个字符 s[i],容易发现 'A'+(s[i]-'A'+k+26)%26 就是这个字符加密后的结果。
按照如上思路实现代码即可:

#include<bits/stdc++.h>
using namespace std;
const long long INF=1E9;
long long n,k;
string s;
int main(){
    cin>>n>>k>>s;
    if(k<0)k+=INF*26;//处理负数
    k%=26;
    for(int i=0;i<s.size();++i){
        if(isalpha(s[i])){
            s[i]='A'+(s[i]-'A'+k+26)%26;
        }
    }
    cout<<s;
    return 0;
}
posted @ 2026-08-04 18:50  heffo_hard  阅读(15)  评论(0)    收藏  举报