Day 0x3 UVa10222 Decode the Mad man

Virtual Judge
ZeroJudge

题意

  • 输入一加密过字串,解密方式为键盘上向左两格,输出解密结果
  • 需要注意的点:
    1. 只有一笔测资 (单行)
  • 隐藏要点:
    1. 不会有不合理的输入
    2. 输入都是小写

      我看 ZOJ 题目写的,原文好像没看到,但大家好像都会特别转小写???

解法

  • 输入可能是一或多个字元 (含空白),因此用 gets() 或其他可忽略空白之写法来读取,并存到字元阵列

    gets() 是个不安全的函式,但...反正解题嘛

    char str[999] = {0};
    gets(str);
    
  • 解密方法
    • for 回圈去逐字元检查 & 解密
    • 方式有很多,这边简单列举几个而已,有兴趣的可以自己查一下其他大神精辟写法
    • switch 工人智慧版
      • 反正一星题嘛,复制贴上应该也写很快 (?
      for(i = 0; i < strlen(str); i++){
          switch(str[i]){
              case 32:
                  printf(" ");
                  break;
              case 'e':
                  printf("q");
                  break;
              case 'd':
                  printf("a");
                  break;
              case 'c':
                  printf("z");
                  break;
              case 'r':
                  printf("w");
                  break;
              case 'f':
                  printf("s");
                  break;
              case 'v':
                  printf("x");
                  break;
              case 't':
                  printf("e");
                  break;
              case 'g':
                  printf("d");
                  break;
              case 'b':
                  printf("c");
                  break;
              case 'y':
                  printf("r");
                  break;
              case 'h':
                  printf("f");
                  break;
              case 'n':
                  printf("v");
                  break;
              case 'u':
                  printf("t");
                  break;
              case 'j':
                  printf("g");
                  break;
              case 'm':
                  printf("b");
                  break;
              case 'i':
                  printf("y");
                  break;
              case 'k':
                  printf("h");
                  break;
              case ',':
                  printf("n");
                  break;
              case 'o':
                  printf("u");
                  break;
              case 'l':
                  printf("j");
                  break;
              case '.':
                  printf("m");
                  break;
              case 'p':
                  printf("i");
                  break;
              case ';':
                  printf("k");
                  break;
              case '/':
                  printf(",");
                  break;
              case '[':
                  printf("o");
                  break;
              case '\'':
                  printf("l");
                  break;
              case ']':
                  printf("p");
                  break;
              case '\\':
                  printf("[");
                  break;
              case '=':
                  printf("0");
                  break;
              case '-':
                  printf("9");
                  break;
              case '0':
                  printf("8");
                  break;
              case '9':
                  printf("7");
                  break;
              case '8':
                  printf("6");
                  break;
              case '7':
                  printf("5");
                  break;
              case '6':
                  printf("4");
                  break;
              case '5':
                  printf("3");
                  break;
              case '4':
                  printf("2");
                  break;
              case '3':
                  printf("1");
                  break;
              case '2':
                  printf("`");
                  break;
          }
      }
      
    • 建表法 ver. 1
      • 因为不会有不合理的输入
      1. 把键盘上每个按键都先存到字元阵列里
      2. 逐字检查时先过滤掉空白字元
      3. 解密时便查找 1. 的表,找到就输出往前第二个字元
      char table[ ] = "`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./";
      ...
      for(j = 0; j < strlen(table); j++){
          if(str[i] == table[j]){
              printf("%c", table[j - 2]);
              break;
          }
      }
      
    • 建表法 ver. 2
      • 建立两张表,分别对应输入与输出,即为加密後与解密後的字串,因此两阵列长度一样,但建表时需小心键盘上每列起始与结束的不同
      • 阵列直接存入空白,因此处理字串时不用预先过滤
      char ct[ ] = " 234567890-=ertyuiop[]\\dfghjkl;'cvbnm,./";
      char pt[ ] = " `1234567890qwertyuiop[asdfghjklzxcvbnm,";
      
  • C Code
    #include<stdio.h>
    #include<string.h>
    
    int main(){
    
        char str[999] = {0};
        char ct[ ] = " 234567890-=ertyuiop[]\\dfghjkl;'cvbnm,./";
        char pt[ ] = " `1234567890qwertyuiop[asdfghjklzxcvbnm,";
        int i, j;
    
        gets(str);
    
        for(i = 0; i < strlen(str); i++){
            for(j = 0; j < strlen(ct); j++){
                if(str[i] == ct[j]){
                    printf("%c", pt[j]);
                }
            }
        }
    
        printf("\n");
    
        return 0;
    }
    
  • C++
    • 可以运用 string 来处理字串
    • 查找时用 string::find 更简短
    • Reference
    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
    
        string str;
        string table = "`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./";
    
        getline(cin, str);
    
        for(int i = 0; i < str.size(); i++){
            if(str[i]  == ' '){
                cout << " ";
            }
            else{
                cout << table[table.find(str[i]) - 2];
            }
        }
    
        cout << "\n";
    }
    

<<:  Ubuntu - Ubuntu 查看 CPU 温度

>>:  鬼故事 - 我的密码是...

[第30天]理财达人Mx. Ada-货柜运价指数FBX

前言 本文说明使用scrapy爬虫函式库抓取海运FBX指数。 波罗的海货柜运价指数[FBX] 波罗的...

最短路径问题 (6)

10.8 更多的 Leetcode 例题 Leetcode 1129. Shortest Path ...

DAY17-EXCEL统计分析:T检定介绍

T检定: 什麽时候会用到T检定呢? 当我们不知道母体变异数为多少时就是用T检定 T检定的公式为: (...

学习Python纪录Day20 - 新增项目

新增表格 add_table() rows:列数 cols:栏数 doc = docx.Docume...

[Day 15] Reverse 小忙碌

今天我过得很充实, 前几天有看到读者的留言 很感激你们愿意花时间看我的文章 看我分享我每日小生活 为...