输出亲朋字符串

GitHub跳转原题关系图返回列表

把字符串看成环,每位输出字符是原串该位与下一位(末位绕回首位)的 ASCII 值之和。

OJ: roj

题目 ID: 1133

难度:入门

标签:入门字符串模拟python

创建: 2026-09-29 20:14

更新: 2026-10-05 02:58

题目描述

给定长度 2≤n≤1002 \le n \le 100 的字符串 ss。亲朋字符串 s1s_1 的第 ii 个字符为 sis_i 与 s(i+1) mod ns_{(i+1)\bmod n} 的 ASCII 值之和对应的字符(末位绕回首位)。输出 s1s_1。

样例:输入 1234,输出 cege。

思路

按定义逐位模拟:对每一位 ii,用取模得到环形下一位,两字符 ASCII 值相加即为输出字符。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 20:15
# update_at: 2026-09-29 20:15

import sys


def solve() -> None:
    data = iter(sys.stdin.buffer.read().split())
    s: str = next(data).decode()

    # 环形搭档:第 i 个字符与第 i+1 个配对,末位绕回首字符;一次错位拼接即可全配对
    partner: str = s[1:] + s[:1]

    # 亲朋字符 = 两位 ASCII 值之和对应的字符(ASCII ≤ 63,和 ≤ 126,仍是可打印字符)
    print(''.join(chr(ord(a) + ord(b)) for a, b in zip(s, partner)))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 02:58
 * update_at: 2026-10-05 02:58
 */
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

char s[105]; // 输入字符串
char ans[105]; // 亲朋字符串

int main() {
    scanf("%s", s);
    int n = strlen(s);
    // 第 i 位由 s[i] 与环形下一位 s[(i+1)%n] 的 ASCII 之和得到
    for (int i = 0; i < n; i++) {
        int j = (i + 1) % n;
        ans[i] = s[i] + s[j];
    }
    ans[n] = '\0';
    printf("%s\n", ans);
    return 0;
}