遇健 发表于 2021-11-27 09:22:12

用c语言

哪个大佬可以帮我一下,顺便讲解一下

利用数组编写程序(c语言)

在密码学中,恺撒密码是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。向后移动的位数就是密钥,例如,密钥 k=3,则每个字母都会向前移动 3位:a 会被替换为 d;b 会被替换成 e;依此类推。字母表末尾将回卷到字母表开头。于是,w 会被替换为 z,x 会被替换为 a。 请编写程序,要求输入密码和信息,然后京程序加密后输出密文,并设计解密程序对密文进行解密。

傻眼貓咪 发表于 2021-11-27 09:22:13

如题目,密码类型为英文字母
代码:#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

wp231957 发表于 2021-11-27 09:39:58

请问这个题目哪里有难度

人造人 发表于 2021-11-27 11:15:43

你写的代码呢?你就打算在这里要一个正确答案然后交差了事?
这题目真的不难,你写不出来,说明你基础学的不好,可以返回前面去温故知新

#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;
}

happy___ 发表于 2021-11-27 13:32:33

人造人 发表于 2021-11-27 11:15
你写的代码呢?你就打算在这里要一个正确答案然后交差了事?
这题目真的不难,你写不出来,说明你基础学的 ...

????

人造人 发表于 2021-11-27 14:03:46

happy___ 发表于 2021-11-27 13:32
????

???

pythonnulixuexi 发表于 2021-11-27 16:00:32

应该是向后移动3位吧

pythonnulixuexi 发表于 2021-11-27 16:23:42

傻眼貓咪 发表于 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;
}

做了一点修改

pythonnulixuexi 发表于 2021-11-27 16:31:52

人造人 发表于 2021-11-27 11:15
你写的代码呢?你就打算在这里要一个正确答案然后交差了事?
这题目真的不难,你写不出来,说明你基础学的 ...

你这个代码有点难理解呀,,,,还有   decode那里应该是取模26吧

人造人 发表于 2021-11-27 17:03:14

pythonnulixuexi 发表于 2021-11-27 16:31
你这个代码有点难理解呀,,,,还有   decode那里应该是取模26吧

是 -26,没问题

傻眼貓咪 发表于 2021-11-27 17:27:22

pythonnulixuexi 发表于 2021-11-27 16:23
做了一点修改

都可以,最重要自己喜欢,结果没有出错就行。{:5_108:}

傻眼貓咪 发表于 2021-11-27 17:34:57

pythonnulixuexi 发表于 2021-11-27 16:31
你这个代码有点难理解呀,,,,还有   decode那里应该是取模26吧

取模可以是负数,完全没有问题的(相关知识可以参考数学 mod)
页: [1]
查看完整版本: 用c语言