鱼C论坛

 找回密码
 立即注册
查看: 2965|回复: 11

[已解决]有关离散数学的一道算法题求助大佬(我新手...)

[复制链接]
发表于 2021-5-4 14:17:26 | 显示全部楼层 |阅读模式
50鱼币

老师布置的一个作业,不太懂要怎么弄,是要用字符数组一个一个遍历吗(感觉这样有点笨...)
最佳答案
2021-5-4 14:17:27
  1. #include <stdio.h>
  2. #include <ctype.h>

  3. typedef struct {
  4.     char first;
  5.     char second;
  6. } rule_t;

  7. char enc_table[256];
  8. char dec_table[256];

  9. void rule_init(rule_t rule[], size_t size) {
  10.     for(size_t i = 0; i < 256; ++i) {
  11.         enc_table[i] = dec_table[i] = i;
  12.     }
  13.     for(size_t i = 0; i < size; ++i) {
  14.         enc_table[tolower(rule[i].first)] = enc_table[(int)rule[i].first] = rule[i].second;
  15.         dec_table[tolower(rule[i].second)] = dec_table[(int)rule[i].second] = rule[i].first;
  16.     }
  17. }

  18. char *enc(char buff[], size_t size, const char *str) {
  19.     for(size_t i = 0; ; ++i) {
  20.         if(--size == 0) {buff[i] = '\0'; break;}
  21.         buff[i] = enc_table[(int)str[i]];
  22.         if(str[i] == '\0') break;
  23.     }
  24.     return buff;
  25. }

  26. char *dec(char buff[], size_t size, const char *str) {
  27.     for(size_t i = 0; ; ++i) {
  28.         if(--size == 0) {buff[i] = '\0'; break;}
  29.         buff[i] = dec_table[(int)str[i]];
  30.         if(str[i] == '\0') break;
  31.     }
  32.     return buff;
  33. }

  34. int main(void) {
  35.     rule_t rule[] = {
  36.         {'A', 'D'}, {'B', 'E'}, {'C', 'S'}, {'D', 'T'}, {'E', 'I'}, {'F', 'N'}, {'G', 'Y'}, {'H', 'A'}, {'I', 'B'},
  37.         {'J', 'C'}, {'K', 'F'}, {'L', 'G'}, {'M', 'H'}, {' ', '+'}, {'N', 'J'}, {'O', 'K'}, {'P', 'L'}, {'Q', 'M'},
  38.         {'R', 'O'}, {'S', 'P'}, {'T', 'Q'}, {'U', 'R'}, {'V', 'U'}, {'W', 'V'}, {'X', 'W'}, {'Y', 'X'}, {'Z', 'Z'},
  39.         {'.', '-'}
  40.     };
  41.     rule_init(rule, sizeof(rule) / sizeof(rule[0]));
  42.     char buff[1024];
  43.     puts(enc(buff, 1024, "Good Friends in my eyes."));
  44.     puts(dec(buff, 1024, "YKKT+NOBIJTP+BJ+HX+IXIP-"));
  45.     return 0;
  46. }
复制代码

  1. YKKT+NOBIJTP+BJ+HX+IXIP-
  2. GOOD FRIENDS IN MY EYES.
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-4 14:17:27 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <ctype.h>

  3. typedef struct {
  4.     char first;
  5.     char second;
  6. } rule_t;

  7. char enc_table[256];
  8. char dec_table[256];

  9. void rule_init(rule_t rule[], size_t size) {
  10.     for(size_t i = 0; i < 256; ++i) {
  11.         enc_table[i] = dec_table[i] = i;
  12.     }
  13.     for(size_t i = 0; i < size; ++i) {
  14.         enc_table[tolower(rule[i].first)] = enc_table[(int)rule[i].first] = rule[i].second;
  15.         dec_table[tolower(rule[i].second)] = dec_table[(int)rule[i].second] = rule[i].first;
  16.     }
  17. }

  18. char *enc(char buff[], size_t size, const char *str) {
  19.     for(size_t i = 0; ; ++i) {
  20.         if(--size == 0) {buff[i] = '\0'; break;}
  21.         buff[i] = enc_table[(int)str[i]];
  22.         if(str[i] == '\0') break;
  23.     }
  24.     return buff;
  25. }

  26. char *dec(char buff[], size_t size, const char *str) {
  27.     for(size_t i = 0; ; ++i) {
  28.         if(--size == 0) {buff[i] = '\0'; break;}
  29.         buff[i] = dec_table[(int)str[i]];
  30.         if(str[i] == '\0') break;
  31.     }
  32.     return buff;
  33. }

  34. int main(void) {
  35.     rule_t rule[] = {
  36.         {'A', 'D'}, {'B', 'E'}, {'C', 'S'}, {'D', 'T'}, {'E', 'I'}, {'F', 'N'}, {'G', 'Y'}, {'H', 'A'}, {'I', 'B'},
  37.         {'J', 'C'}, {'K', 'F'}, {'L', 'G'}, {'M', 'H'}, {' ', '+'}, {'N', 'J'}, {'O', 'K'}, {'P', 'L'}, {'Q', 'M'},
  38.         {'R', 'O'}, {'S', 'P'}, {'T', 'Q'}, {'U', 'R'}, {'V', 'U'}, {'W', 'V'}, {'X', 'W'}, {'Y', 'X'}, {'Z', 'Z'},
  39.         {'.', '-'}
  40.     };
  41.     rule_init(rule, sizeof(rule) / sizeof(rule[0]));
  42.     char buff[1024];
  43.     puts(enc(buff, 1024, "Good Friends in my eyes."));
  44.     puts(dec(buff, 1024, "YKKT+NOBIJTP+BJ+HX+IXIP-"));
  45.     return 0;
  46. }
复制代码

  1. YKKT+NOBIJTP+BJ+HX+IXIP-
  2. GOOD FRIENDS IN MY EYES.
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-4 14:20:41 | 显示全部楼层
图片在这
qq_pic_merged_1620108666147.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-4 15:41:58 | 显示全部楼层
本帖最后由 zsy1998 于 2021-5-4 16:04 编辑
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main() {
  4.     char f[256] = {0}, f_inv[256] = {0};
  5.     strcpy(f + 'A', "DESTINYABCFGHJKLMOPQRUVWXZ");
  6.     f[' '] = '+';
  7.     f['.'] = '-';
  8.     for (int i = 0; i < 256; i++) {
  9.         f_inv[(int)f[i]] = i;
  10.     }
  11.     char s[] = "YKKT+NOBIJTP+BJ+HX+IXIP-";
  12.     for (int i = 0; s[i]; i++) {
  13.         s[i] = f_inv[(int)s[i]];
  14.     }
  15.     printf("%s\n", s);
  16.     return 0;
  17. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-4 19:31:55 | 显示全部楼层
大佬们能讲下自己的思路吗,感觉有点懵逼啊..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-4 19:32:55 | 显示全部楼层

大佬能讲下思路吗...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-4 19:33:38 | 显示全部楼层

讲下思路可以吗大佬...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-4 19:42:07 | 显示全部楼层
猫儿恋上鱼 发表于 2021-5-4 19:32
大佬能讲下思路吗...

这该怎么讲呢,你哪里不明白吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-4 22:14:14 | 显示全部楼层

我没学过离散数学,这题我就用遍历的方法解决了。

  1. #include <stdio.h>


  2. int Decode(char *crypt_str,char *recipient);
  3. int main(void){
  4.     char test_str[] = "YKKT+NOBIJTP+BJ+HX+IXIP-";
  5.     char decode_recipient[128];
  6.     Decode(test_str,decode_recipient);
  7.     printf("%s\n",decode_recipient);

  8.     return(0);

  9. }

  10. int Decode(char *crypt_str,char *recipient){
  11.     char CodeTable[] = "DESTINYABCFGH+JKLMOPQRUVWXZ-";
  12.     while (*crypt_str != '\0'){
  13.         for (int i = 0; i < 28; ++i) {          //遍历码表
  14.             if(CodeTable[i] == *crypt_str) {
  15.                 *recipient = (i > 13)?(i == 27 ? '.':'A'+i-1):(i == 13 ? ' ': 'A'+i);  //嵌套三目运算符,将码表分为三个部分。
  16.                 ++recipient;
  17.                 break;
  18.             }
  19.         }
  20.         ++crypt_str;
  21.     }
  22.     *recipient = '\0';      //添加结束符。
  23.     return(0);
  24. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-5 14:46:20 | 显示全部楼层
人造人 发表于 2021-5-4 19:42
这该怎么讲呢,你哪里不明白吗?

比如前几个函数的作用可以讲讲吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-5 15:31:15 | 显示全部楼层
猫儿恋上鱼 发表于 2021-5-5 14:46
比如前几个函数的作用可以讲讲吗

rule_init 用来初始化 enc_table 和 dec_table 这两张表,一个用来加密,另一个是解密
enc 和 dec 这两个函数加密和解密字符串,通过查 enc_table,dec_table 这两张表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-5 16:09:02 | 显示全部楼层
猫儿恋上鱼 发表于 2021-5-4 19:32
大佬能讲下思路吗...

f是题目中的映射,就是A对应D,B对应E等等,也就是f['A']='D'。解码求f的逆映射f_inv,也就是D应该替换成A,E替换成B,也就是f_inv['D']='A',也就是f_inv[f['A']]='A',这是9到11行求f_inv的思路,这块比较绕,要重点理解。
还有需要注意的是第5行将数组所有元素初始化为0了。第6行f本质是一个指针,加上'A'的ASCII码的偏移,这一行本质上等价于批量赋值,即f['A']='D',f['B']='E'等等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 12:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表