用c语言
哪个大佬可以帮我一下,顺便讲解一下利用数组编写程序(c语言)
在密码学中,恺撒密码是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。向后移动的位数就是密钥,例如,密钥 k=3,则每个字母都会向前移动 3位:a 会被替换为 d;b 会被替换成 e;依此类推。字母表末尾将回卷到字母表开头。于是,w 会被替换为 z,x 会被替换为 a。 请编写程序,要求输入密码和信息,然后京程序加密后输出密文,并设计解密程序对密文进行解密。
如题目,密码类型为英文字母
代码:#include <stdio.h>
/*恺撒密码*/
void CaesarCipher(char p[], int n, int k){ for(size_t i = 0; i < n; i++) p = ((p-('a'-k))%26)+'a'; }
/*解密*/
void Decrypt(char p[], int n, int k){ for(size_t i = 0; i < n; i++) p = p-k >= 'a' ? p-k : p-k+26; }
int main()
{
char password = "wxyz"; // 原密码
int key = 3; // 密钥
printf("原密码:%s\n", password);
CaesarCipher(password, 4, key); // 将原密码转变成恺撒密码
printf("恺撒密码:%s\n", password);
Decrypt(password, 4, key); // 解密
printf("解密:%s", password);
return 0;
}输出:原密码:wxyz
恺撒密码:zabc
解密:wxyz 请问这个题目哪里有难度 你写的代码呢?你就打算在这里要一个正确答案然后交差了事?
这题目真的不难,你写不出来,说明你基础学的不好,可以返回前面去温故知新
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void encode(char *buff, const char *str, unsigned char key) {
if(buff != str) strcpy(buff, str);
for(size_t i = 0; buff; ++i) {
if(!islower(buff)) continue;
buff = 'a' + (buff - 'a' + key) % 26;
}
}
void decode(char *buff, const char *str, unsigned char key) {
if(buff != str) strcpy(buff, str);
for(size_t i = 0; buff; ++i) {
if(!islower(buff)) continue;
buff = 'z' + (buff - 'z' - key) % -26;
}
}
void decode2(char *buff, const char *str, unsigned char key) {
encode(buff, str, 26 - key);
}
int main(void) {
char buff;
const char *str = "abcdABCD;1234[]9876;ZXCVzxcv-";
encode(buff, str, 3);
puts(str);
puts(buff);
decode(buff, buff, 3);
puts(buff);
puts("");
encode(buff, str, 3);
puts(str);
puts(buff);
decode2(buff, buff, 3);
puts(buff);
return 0;
}
人造人 发表于 2021-11-27 11:15
你写的代码呢?你就打算在这里要一个正确答案然后交差了事?
这题目真的不难,你写不出来,说明你基础学的 ...
???? happy___ 发表于 2021-11-27 13:32
????
??? 应该是向后移动3位吧 傻眼貓咪 发表于 2021-11-27 15:00
如题目,密码类型为英文字母
代码:输出:
#include<stdio.h>
/*凯撒密码*/
void CasesarCipher(char p[],int n,int k)
{
for(size_t i=0;i<n;i++)
{
p=(p-'a'+k)%26+'a'; //这里感觉不加括号比较好理解
}
}
/*解密*/
void Decrypt(char p[],int n,int k)
{
for(size_t i=0;i<n;i++)
{
p=p-k>='a'?p-k:p-k+26; //这里有个等于号,有a时不会出错
}
}
int main()
{
char password="abcd";
int key=3;
printf("原密码:%s\n",password);
CasesarCipher(password,4,key);
printf("加密后:%s\n",password);
Decrypt(password,4,key);
printf("解密后:%s\n",password);
return 0;
}
做了一点修改 人造人 发表于 2021-11-27 11:15
你写的代码呢?你就打算在这里要一个正确答案然后交差了事?
这题目真的不难,你写不出来,说明你基础学的 ...
你这个代码有点难理解呀,,,,还有 decode那里应该是取模26吧 pythonnulixuexi 发表于 2021-11-27 16:31
你这个代码有点难理解呀,,,,还有 decode那里应该是取模26吧
是 -26,没问题
pythonnulixuexi 发表于 2021-11-27 16:23
做了一点修改
都可以,最重要自己喜欢,结果没有出错就行。{:5_108:} pythonnulixuexi 发表于 2021-11-27 16:31
你这个代码有点难理解呀,,,,还有 decode那里应该是取模26吧
取模可以是负数,完全没有问题的(相关知识可以参考数学 mod)
页:
[1]