news 2026/6/10 14:24:18

错题本:恺撒加密

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
错题本:恺撒加密

我写的代码:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #define n 10000 void kasa(char* a, const char* b,const char* c); void encryption(char* a); int main() { char str1[n]; char str2[n]; char str3[n]; scanf("%9999s", str1); //限制字符串长度,给'\0'预留一个位置 scanf("%9999s", str2); int i = 0; while (str1[i]) { str3[i] = str1[i]; i++; } str3[i] = '\0'; kasa(str1, str2,str3); } void kasa(char* a, const char* b,const char* c) { int i = 0; int count = 0; while (a[i] != '\0'&&b[i]!='\0') //两个都要判断防止数组访问越界 { if (strlen(a) != strlen(b)) //如果长度不一样的话也是加密不到的!!! { printf("IMPOSSIBLE"); return; } if ((a[i] >= 'a' && a[i] <= 'z' && b[i] >= '0' && b[i] <= '9') || (b[i] >= 'a' && b[i] <= 'z' && a[i] >= '0' && a[i] <= '9')) { printf("IMPOSSIBLE"); return; } i++; } i = 0; while (1) { if (count >= 1) { if (strcmp(a, c) == 0) { printf("IMPOSSIBLE"); return; } } if (a[i] != b[i]) { encryption(a); count++; i = 0; //这里 i 的值需要重置,加密之后所有的字符要从 i=0 开始判断 continue; } if (a[i] == '\0') { printf("%d", count); return; } i++; } } void encryption(char* a) { while (*a) { if (*a == 'z') { *a = 'a'; } else if (*a == '9') { *a = '0'; } else { *a = *a + 1; } a++; } }

缺点:(1)容易造成数组越界

(2)时间复杂度太高

(3)代码过于复杂

解题思路:

(1)先用scanf输入两组数组的数据

(2)用str3记录str1的数组方便后续用于能否加密成功做判断(当str1加密很多次之后如果又变回和原来一样了就是”IMPOSSIBLE“)

(3)进入函数kasa首先就是判断长度是否一样,如果不一样的话一定是加密不成功的进入循环要同时判断两个数组是否遇到了 ’\0‘ 不然容易数组访问越界

这里第一个循环就有问题,第一个判断长度的 if 语句要放在循环外面

(4)判断每个位置对应的字符类型是否相同(这里用的方法太过复杂其实可以直接用isdigit,isalpha)函数来判断

(5)直接用一个死循环,因为我原先不知道至多循环多少次可以加密成功

(6)进入循环给count(加密次数)计数如果大于1了话每次都要进来判断是否加密回原来那样子了

(7)判断对应元素是否相等不相等的话进入encryption函数加密,每次加密完要记得把 i 重置成0,因为后面的判断还是要从一开始判断

(8)如果上面的都通过了说明就是加密成功了,直接打印加密次数

PS:彩色的字体都是把代码丢给AI它帮我改进的;黑色加粗和块引用是之后自己发现的错误


AI写的代码:

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<ctype.h> int main() { char str1[1000]; char str2[1000]; scanf("%s", str1); scanf("%s", str2); size_t s1_len = strlen(str1); size_t s2_len = strlen(str2); if (s1_len != s2_len) { printf("IMPOSSIBLE"); return 0; } for (int i = 0; i < s1_len; i++) { if (isdigit(str1[i]) != isdigit(str2[i]) || isalpha(str1[i]) != isalpha(str2[i])) { printf("IMPOSSIBLE"); return 0; } } int k; if (isdigit(str1[0])) { int str1n = str1[0] - '0'; int str2n = str2[0] - '0'; k = (str2n - str1n + 10) % 10; } else { int str1n = str1[0] - 'a'; int str2n = str2[0] - 'a'; k = (str2n - str1n + 26) % 26; } for (int i = 1; i < s1_len; i++) { if (isdigit(str1[i])) { int str1n = str1[i] - '0'; int str2n = str2[i] - '0'; if ((k + str1n) % 10 != str2n) { printf("IMPOSSIBLE"); return 0; } } else { int str1n = str1[i] - 'a'; int str2n = str2[i] - 'a'; if ((k + str1n) % 26 != str2n) { printf("IMPOSSIBLE"); return 0; } } } printf("%d\n", k); return 0; }

解题思路:

判断完长度和字符类型后,将字符转为整型数字然后看第一个字符需要移动多少次能和对应的数组匹配上,之后用循环判断数组的每个元素,如果和第一个元素加密的次数不一样就直接结束输出”IMPOSSIBLE“

这里积累一下这种思路:将字符转换成数字的方法然后直接用数字的加减求余来算出需要加密的次数

如果都通过了就可以直接输出k就是加密的次数了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 12:52:07

通俗解释Intel平台为何限制USB3.0理论传输速度

为什么你的USB3.0永远跑不满5Gbps&#xff1f;Intel平台的“性能缩水”真相你有没有遇到过这种情况&#xff1a;买了一个标称支持USB3.0的高速固态U盘&#xff0c;宣传页上写着“读取速度可达500MB/s”&#xff0c;结果插在电脑上拷贝电影时&#xff0c;实测只有380MB/s&#x…

作者头像 李华
网站建设 2026/5/13 11:29:27

Dify平台的数据可视化描述生成效果展示

Dify平台的数据可视化描述生成效果展示 在企业数据爆炸式增长的今天&#xff0c;BI系统每天都在生成成百上千张图表&#xff0c;但真正能被快速理解、转化为决策的信息却少之又少。一张精美的折线图或许能展示趋势&#xff0c;但它不会告诉你“为什么9月销售额突然跳水”——这…

作者头像 李华
网站建设 2026/6/10 2:53:22

超详细版USB3.0引脚定义在工业相机中的应用

USB3.0引脚详解&#xff1a;工业相机高速图像传输的“神经脉络”你有没有遇到过这样的情况&#xff1f;一台高分辨率工业相机&#xff0c;明明支持4K60fps&#xff0c;可实际采集时却频繁丢帧、画面卡顿&#xff0c;甚至主机识别不稳定。排查软件、驱动、CPU占用率……最后发现…

作者头像 李华
网站建设 2026/5/26 21:09:46

Dify平台的因果推理能力测试案例

Dify平台的因果推理能力测试实践 在当前大语言模型&#xff08;LLM&#xff09;广泛应用的背景下&#xff0c;企业越来越关注模型是否具备真正的“理解”能力——不仅仅是生成流畅文本&#xff0c;而是能否进行逻辑推演、识别事件之间的因果关系。然而&#xff0c;传统的AI开发…

作者头像 李华
网站建设 2026/6/10 11:35:15

Dify在物联网设备管理中的自然语言指令解析应用

Dify在物联网设备管理中的自然语言指令解析应用 在现代工厂的运维控制室里&#xff0c;一位工程师对着语音助手说&#xff1a;“帮我查一下昨天下午三点之后所有温度超过35℃的传感器。”几秒钟后&#xff0c;系统不仅列出相关设备清单&#xff0c;还自动标记出其中三台存在持续…

作者头像 李华
网站建设 2026/6/10 12:25:25

Ubuntu下Qt进程重启失败全解析

在Ubuntu下使用Qt的QProcess::startDetached()重启应用程序时出现失败&#xff0c;可能涉及进程残留、资源冲突、信号处理或系统策略等问题。以下是系统性排查和解决方案&#xff1a;1. 核心问题诊断进程残留检查使用ps aux | grep <应用名>确认进程是否完全终止。若存在…

作者头像 李华