【C++】B2113 输出亲朋字符串

【C++】B2113 输出亲朋字符串

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]本文专栏: C++


文章目录


在这里插入图片描述

💯前言

C++ 参考手册

在这里插入图片描述

💯题目描述

如下图所示,题目要求生成一个“亲朋字符串”,具体规则如下:
B2113 输出亲朋字符串

在这里插入图片描述
亲朋字符串定义如下:
给定字符串s,它的“亲朋字符串”按以下规则生成:第1个字符等于s中第1个字符的ASCII值加第2个字符的ASCII值;第2个字符等于s中第2个字符的ASCII值加第3个字符的ASCII值;…以此类推;如果是字符串的最后一个字符,则与字符串第1个字符相加。

输入格式:

  • 一行字符串,长度大于2且小于等于100。

输出格式:

  • 一行“亲朋字符串”。

示例输入输出

输入:

1234 

输出:

cege 

💯思路分析

在本题中,字符串的核心操作包括以下几点:

  1. 逐字符遍历: 我们需要逐一处理字符串的每个字符,将其与下一个字符相加。
  2. 循环处理边界: 特别是字符串的最后一个字符,需要将其与第一个字符相加。
  3. ASCII计算: 两个字符相加的结果实际上是ASCII值的和,需要将结果重新转换为字符。
  4. 内存安全: 避免字符串越界的问题是代码实现中需要注意的核心。

接下来,我们将通过三种代码实现来逐步解析。


💯我的做法及分析

代码实现

#include<iostream>#include<cstdio>#include<cstring>usingnamespace std;constint N =105;// 定义最大长度char s1[N];// 输入字符串char s2[N];// 输出字符串intmain(){scanf("%s", s1);// 读取输入int len =strlen(s1);// 获取字符串长度for(int i =0; i < len; i++){if(i == len -1) s2[i]= s1[i]+ s1[0];// 最后一个字符和第一个字符相加else s2[i]= s1[i]+ s1[i +1];// 当前字符与下一个字符相加} s2[len]='\0';// 补充字符串结束符 cout << s2 << endl;// 输出结果return0;}
在这里插入图片描述

运行分析

  1. 输入1234后,程序依次计算:
    • 第1个字符:'1' + '2' = 49 + 50 = 99,ASCII值99对应字符'c'
    • 第2个字符:'2' + '3' = 50 + 51 = 101,ASCII值101对应字符'e'
    • 第3个字符:'3' + '4' = 51 + 52 = 103,ASCII值103对应字符'g'
    • 第4个字符:'4' + '1' = 52 + 49 = 101,ASCII值101对应字符'e'
  2. 输出结果为cege

优点与不足

  • 优点:
    • 使用数组存储结果,方便调试和后续操作。
    • 逻辑清晰,易于理解。
  • 不足:
    • 对最后一个字符的处理需要特殊判断,显得不够简洁。
    • 若忘记手动添加字符串结束符,可能会导致程序输出异常。

💯老师的第一种做法及分析

代码实现

#include<iostream>usingnamespace std;constint N =110;char str[N];intmain(){ cin >> str;// 输入字符串int i =0;while(str[i +1]){// 遍历到倒数第二个字符char tmp = str[i]+ str[i +1];// 当前字符与下一个字符相加 cout << tmp;// 输出结果 i++;}// 单独处理最后一个字符与第一个字符 cout <<(char)(str[i]+ str[0])<< endl;return0;}
在这里插入图片描述

优点与不足

  • 优点:
    • 直接输出,无需额外数组存储结果。
    • 逻辑简单,避免了对字符串结束符的显式处理。
  • 不足:
    • 需要特判最后一个字符,稍显复杂。
    • 输出的结果直接依赖于循环条件str[i + 1],对于初学者来说可能不够直观。
这类题⽬就是精确的控制下标,防⽌越界,算准下标。cout 在打印数据的时候是需要明确知道打印数据的类型的,⽅法1中 str[i] + str[0] 算的结果直接打印就被编译器当做整数打印了,所以我们做了 (char) 的强制类型转换。

💯老师的第二种做法及分析

代码实现

#include<iostream>#include<cstring>usingnamespace std;constint N =110;char str[N];intmain(){ cin >> str;// 输入字符串int len =strlen(str);// 获取字符串长度for(int i =0; i < len; i++){char tmp = str[i]+ str[(i +1)% len];// 当前字符与下一个字符(取模)相加 cout << tmp;// 输出结果} cout << endl;// 换行return0;}
在这里插入图片描述

优点与不足

  • 优点:
    • 使用取模运算% len统一处理了首尾字符的关系,无需特殊判断。
    • 代码结构简洁,逻辑清晰。
  • 不足:
    • 如果不熟悉取模运算的读者,可能需要额外理解其含义。

示例分析

对于输入1234

  • 第1个字符:str[0] + str[1] = '1' + '2' = 99,输出c
  • 第2个字符:str[1] + str[2] = '2' + '3' = 101,输出e
  • 第3个字符:str[2] + str[3] = '3' + '4' = 103,输出g
  • 第4个字符:str[3] + str[0] = '4' + '1' = 101,输出e

最终输出cege


💯方法对比总结

比较维度我的做法老师的第一种做法老师的第二种做法
逻辑复杂度较高,需要特判最后一个字符较低,需要单独处理最后一个字符最低,通过取模简化逻辑
代码简洁性较为繁琐中等最为简洁
内存使用使用额外数组存储结果无额外数组无额外数组
新手友好性初学者容易理解容易理解可能需额外解释取模的用法

💯拓展与优化

  1. 适配Unicode字符: 如果需要支持更广泛的字符集,可以使用wchar_t或UTF-8编码。

支持std::string 如果将char数组替换为std::string,代码将更加现代化:

#include<iostream>#include<string>usingnamespace std;intmain(){ string str; cin >> str;int len = str.length();for(int i =0; i < len; i++){char tmp = str[i]+ str[(i +1)% len]; cout << tmp;} cout << endl;return0;}

加强鲁棒性: 在所有实现中,都没有处理字符串为空的情况。如果输入为空,代码可能会出错。可以通过在读取输入后加上检查来解决:

if(strlen(str)==0){ cout << endl;return0;}

💯小结

通过这道亲朋字符串题目,我们不仅复习了C++中的字符串操作,还深入理解了下标控制、ASCII计算、以及边界处理等细节。在学习代码的过程中,不同的实现方式展现了从“解决问题”到“简洁优雅”的进阶过程。希望这篇文章能够帮助读者加深对C++字符串处理的理解,同时激发更多的编程灵感!


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Read more

即时通讯系统核心模块实现

即时通讯系统核心模块实现

即时通讯系统核心模块实现:从消息传输到存储检索的全链路设计 在当今数字化时代,即时通讯(IM)系统已成为人们日常沟通、工作协作的基础设施。一个高性能、高可靠的 IM 系统需要妥善解决消息的实时传输、持久化存储、快速检索等核心问题。本文将基于一套实际生产环境的代码实现,详细解析 IM 系统中消息传输服务与存储检索服务的设计思路、技术选型与具体实现,带你深入理解 IM 系统的核心工作原理。 一、系统架构 overview:核心模块与技术栈 在展开具体实现前,我们先梳理这套 IM 系统的核心模块与技术选型。从代码来看,该系统采用微服务架构,将核心功能拆分为消息传输服务与消息存储检索服务,通过标准化接口实现模块间通信。 1.1 核心业务流程 IM 系统的核心业务流程可概括为: 1. 消息发送:用户发送消息后,由消息传输服务负责验证、封装并转发给目标用户 2. 消息存储:传输服务将消息同步到消息队列,由存储服务消费并持久化到数据库 3. 消息检索:用户查询历史消息或关键词搜索时,

By Ne0inhk

【OpenClaw】启动报错 disconnected (1008): unauthorized: gateway token mismatch

【OpenClaw】启动报错 disconnected (1008): unauthorized: gateway token mismatch 📑 文章目录 1. 一、问题现象 2. 二、错误原因分析 3. 三、快速修复(60 秒) 4. 四、Docker 用户特别注意 5. 五、彻底修复(停止 → 清除 → 重启) 6. 六、易混淆错误辨析 7. 七、常用命令速查表 8. 八、总结 一、问题现象 OpenClaw 启动后,控制台输出以下报错信息: disconnected (1008): unauthorized: gateway token mismatch

By Ne0inhk
Flutter 组件 injectfy 适配鸿蒙 HarmonyOS 实战:逻辑注入矩阵,构建跨模块解耦与动态依赖管理架构

Flutter 组件 injectfy 适配鸿蒙 HarmonyOS 实战:逻辑注入矩阵,构建跨模块解耦与动态依赖管理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 injectfy 适配鸿蒙 HarmonyOS 实战:逻辑注入矩阵,构建跨模块解耦与动态依赖管理架构 前言 在鸿蒙(OpenHarmony)生态迈向超大规模应用拆分、涉及数百个独立 Feature 模块与底层硬件服务深度解耦的背景下,如何实现灵活的“控制反转(IoC)”与“依赖注入(DI)”,已成为决定应用架构可维护性的“生命线”。在鸿蒙设备这类强调模块化挂载与 HAP/HSP 动态分发的环境下,如果应用内部的组件实例依然采用强耦合的硬编码初始化,由于由于各模块间复杂的循环依赖,极易由于由于初始化顺序错乱导致应用在流转拉起时的崩溃。 我们需要一种能够实现零成本解耦、支持单例(Singleton)与工厂(Factory)模式且具备极简注册语义的依赖注入框架。 injectfy 为 Flutter 开发者引入了轻量级的对象容器管理方案。它不仅支持对底层 Service 的全局托管,更提供了灵活的注入探测机制。在适配到鸿蒙

By Ne0inhk
Flutter 组件 easter 适配鸿蒙 HarmonyOS 实战:天文学节气算法,构建全球化复活节周期与民俗历法治理架构

Flutter 组件 easter 适配鸿蒙 HarmonyOS 实战:天文学节气算法,构建全球化复活节周期与民俗历法治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 easter 适配鸿蒙 HarmonyOS 实战:天文学节气算法,构建全球化复活节周期与民俗历法治理架构 前言 在鸿蒙(OpenHarmony)生态迈向全球化部署、涉及跨区域文化适配(I18n)及复杂变动日期计算的背景下,如何精确推演具备“阴阳历混合特性”的全球性节日(如复活节),已成为决定跨国类应用“运营确定性”的核心技术难点。在鸿蒙设备这类强调 AOT 极致性能与低功耗常驻服务(AOD)的环境下,如果应用依然依赖手动配置的“节日死表”,由于由于复活节日期在全球范围内的复杂游移性,极易由于由于配置滞后导致海外营销活动的时序错乱。 我们需要一种能够实现高精度天文学推演、支持百年尺度计算且具备纯 Dart 离线运作能力的历法预判方案。 easter 为 Flutter 开发者引入了基于高斯算法(Gauss's algorithm)或曼氏算法(Meeus&

By Ne0inhk