news 2026/5/24 18:36:49

错题本:恺撒加密

作者头像

张小明

前端开发工程师

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/5/12 2:57:14

从热效应角度分析PCB线宽和电流的关系(工业级)

从热效应看透PCB线宽与电流的真实关系&#xff1a;工业级设计的底层逻辑你有没有遇到过这样的情况&#xff1f;明明按照“经验法则”选了线宽&#xff0c;板子一上电&#xff0c;铜箔就开始发烫&#xff0c;甚至测出温升超过30C。更糟的是&#xff0c;在高温老化测试中&#xf…

作者头像 李华
网站建设 2026/5/9 12:32:27

Dify平台的规则引擎与AI决策结合模式探讨

Dify平台的规则引擎与AI决策结合模式探讨 在企业加速拥抱人工智能的今天&#xff0c;一个现实问题摆在面前&#xff1a;如何让大模型的能力真正落地到生产环境中&#xff1f;我们见过太多惊艳的Demo&#xff0c;却也目睹了无数AI项目止步于概念验证阶段。核心症结在于——纯AI系…

作者头像 李华
网站建设 2026/5/22 15:59:58

Dify平台的开发者激励计划展望

Dify平台的开发者激励计划展望 在大语言模型&#xff08;LLM&#xff09;日益渗透到内容生成、客户服务和企业智能决策的今天&#xff0c;一个明显趋势正在浮现&#xff1a;AI开发的重心正从“调通一个模型”转向“构建可落地的应用”。然而&#xff0c;现实中的大多数团队仍困…

作者头像 李华
网站建设 2026/5/23 18:44:11

萤石开放平台 Ehome协议设备接入 |产品介绍

1. 产品简介 1.1 什么是ehome协议 EHome协议是海康威视针对移动监控场景下开发的设备主动注册协议&#xff0c;它不仅支持实时预览、录像回放、对讲、报警、定位等基础功能&#xff0c;而且在海康的不同类型设备上实现了自定义的功能特性&#xff0c;比如智能报警、低功耗场景…

作者头像 李华
网站建设 2026/5/15 19:25:00

18、利用Ruby与Google AdWords进行数据处理和广告优化

利用Ruby与Google AdWords进行数据处理和广告优化 1. Ruby与Microsoft Office结合进行数据导入 在使用Ruby脚本时,当调用涉及数据库的操作,特别是使用 rubyscript2exe 时,程序会先运行一次以确定所需的库。但数据库驱动要在建立数据库连接时才会加载,如果在那之前不运行…

作者头像 李华
网站建设 2026/5/19 7:04:04

电源完整性基础:去耦电容在电路初期的深度剖析

电源完整性设计&#xff1a;从去耦电容看高速电路的“生命线”你有没有遇到过这样的情况&#xff1f;一个看似完美的硬件设计&#xff0c;原理图严谨、布局规整、信号走线干净利落——可一上电&#xff0c;FPGA莫名其妙锁死&#xff1b;MCU在DMA传输时频繁复位&#xff1b;ADC采…

作者头像 李华