news 2026/4/23 9:25:04

错题本:恺撒加密

作者头像

张小明

前端开发工程师

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/4/22 18:41:00

Vetur格式化代码的正确姿势(操作指南)

让 Vue 代码永远整洁&#xff1a;Vetur 格式化的实战配置指南 你有没有遇到过这样的场景&#xff1f; 团队里两个人提交的 .vue 文件&#xff0c;一个用四个空格缩进&#xff0c;一个用两个&#xff1b;有人喜欢分号结尾&#xff0c;有人坚决不用&#xff1b;更离谱的是&am…

作者头像 李华
网站建设 2026/4/18 23:42:36

Linux中部署Chrome Driver的实战案例

从零部署 Chrome Driver&#xff1a;Linux 环境下的实战避坑指南 你有没有遇到过这样的场景&#xff1f;在本地写好的 Selenium 脚本&#xff0c;放到服务器上一跑&#xff0c;直接报错&#xff1a; selenium.common.exceptions.WebDriverException: Message: chromedriver …

作者头像 李华
网站建设 2026/4/18 12:49:12

【C语言】函数递归为什么那么受欢迎?

&#x1f52d; 个人主页&#xff1a;散峰而望 《C语言&#xff1a;从基础到进阶》《编程工具的下载和使用》《C语言刷题》《算法竞赛从入门到获奖》《人工智能AI学习》《AI Agent》 愿为出海月&#xff0c;不做归山云&#x1f3ac;博主简介 文章目录前言1. 递归是什么&#xff…

作者头像 李华
网站建设 2026/4/20 23:36:48

Dify平台的计费与用量统计功能实现细节

Dify平台的计费与用量统计功能实现细节 在AI应用从“能用”走向“可运营”的今天&#xff0c;一个看似不起眼却至关重要的能力浮出水面&#xff1a;如何准确知道谁用了多少资源、该付多少钱。早期的大模型开发往往只关注提示词调优和接口调通&#xff0c;但当系统进入企业生产环…

作者头像 李华
网站建设 2026/4/19 21:40:54

零基础学习DUT验证环境构建的核心要点

零基础也能搞懂&#xff1a;如何构建一个真正可用的DUT验证环境你是不是刚接触芯片验证&#xff0c;面对一堆interface、virtual、modport和 UVM 组件时一头雾水&#xff1f;明明只是想把 DUT 接上测试平台跑个仿真&#xff0c;结果波形图里信号全是 X&#xff0c;driver 没输出…

作者头像 李华
网站建设 2026/4/22 12:47:35

Dify平台的客户成功案例集锦展示

Dify平台的客户成功案例集锦展示 在企业加速拥抱AI的时代&#xff0c;许多团队都面临一个共同困境&#xff1a;大模型能力强大&#xff0c;但真正落地到业务中却步履维艰。提示词反复调试无效、知识库更新后回答不变、客服机器人答非所问、内容生成风格不统一……这些问题背后&…

作者头像 李华