• 1048. 数字加密(20)


    原题: https://www.patest.cn/contests/pat-b-practise/1048

    思路: 首先我必须隆重说一下卡了我好几个小时的弱智错误, 题目中说
    令个位为第1位, 大家注意各位在字符串里是最后1位, 我TM一直以为
    左边第一位是个位, 浪费不少时间.

    如果做此题你在想法设法, 把输入搞成补零对齐, 恭喜你思路和我一开始的
    一样, 后来我参考了OliverLew大神的做法, 发现并不需要这样做.
    下面的代码最核心只有2句话:

    1. i + lena - lenmax
    2. (lenmax - i) % 2 == 0
      第1句话神奇的把字符串a和b正确对应到正确位置
      第2句话, 帮助我们如何在已知最低位(各位)是奇数的情况下, 确定
      其它位的奇偶性.

    由于我一开始, 对奇偶位置的理解有误, 我有意没有用字符串
    下标0的位置, 事实上不用这么做

    实现:

    #include <stdio.h>
    #include <string.h>
    #define LEN 110
    void encrypt (char cha, char chb, int mode);
    
    int main (void) {
        char stra[LEN];
        char strb[LEN];
        int lena;
        int lenb;
        int lenmax;
        char a;
        char b;
        int posa;
        int posb;
        int i;
        int mode;
    
        // 从下标1开始赋值
        scanf("%s %s", stra + 1, strb + 1);
        stra[0] = '#'; // 下标0无用, 但是随便赋个值
        strb[0] = '#'; // 不然会出现各种垃圾吧毛病
        lena = strlen(stra) - 1; // lena就是数组下标最后一个
        lenb = strlen(strb) - 1;
    
        lenmax = lena > lenb ? lena : lenb;
        for (i = 1; i <= lenmax; i++) {
            posa = i + lena - lenmax; // 成功把2套逻辑, 抽象为
            posb = i + lenb - lenmax; // 一体
            a = posa > 0 ? stra[posa] : '0';
            b = posb > 0 ? strb[posb] : '0';
            if ((lenmax - i) % 2 == 0) {
                mode = 1; // 说明i是奇数
            } else {
                mode = 0; // 说明i是偶数
            }
            encrypt(a, b, mode);
        }
        
        return 0;
    }
    
    // mode=0, 偶数模式
    // mode=1, 奇数模式
    void encrypt (char cha, char chb, int mode) {
        char str[] = "0123456789JQK";
        int a = cha - '0';
        int b = chb - '0';
        int res;
    
        if (mode == 1) {
            res = (a + b) % 13;
            printf("%c", str[res]);
        }
        if (mode == 0) {
            res = b - a < 0 ? b - a + 10 : b - a;
            printf("%d", res);
        }
    }
    
    

    参考: OliverLew, http://www.jianshu.com/p/d56b6e4d1ed7

  • 相关阅读:
    hdu3746Cyclic Nacklace(KMP)
    hdu2087剪花布条(KMP)
    cellspacing cellpadding
    3行3列表格 table实现,div+css实现
    自动办公系统
    (转载)互联网协议入门(二)
    (转载)互联网协议入门(一)
    去掉考勤
    第二次装OA系统
    Windows 7系统下局域网文件共享设置方法
  • 原文地址:https://www.cnblogs.com/asheng2016/p/7857065.html
Copyright © 2020-2023  润新知