PAT 1048 数字加密 python

1048 数字加密(20 分)

本题要求实现一种数字加密方法。首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余——这里用 J 代表 10、Q 代表 11、K 代表 12;对偶数位,用 B 的数字减去 A 的数字,若结果为负数,则再加 10。这里令个位为第 1 位。
输入格式:

输入在一行中依次给出 A 和 B,均为不超过 100 位的正整数,其间以空格分隔。
输出格式:

在一行中输出加密后的结果。

输入样例:

1234567 368782971

输出样例:

3695Q8118

作者: CHEN, Yue
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB

问题分析:
本题最大的问题在于,如果A比B长,需要用0补齐,不然测试点2、5过不去
然鹅题中没说啊啊啊啊

代码:

def odd(a, b):
    l = ['J', 'Q', 'K']
    num_odd = eval('({0} + {1}) % 13'.format(a, b))
    if num_odd > 9:
        return l[num_odd - 10]
    else:
        return str(num_odd)


def even(a, b):
    num_even = eval('{0} - {1}'.format(b, a))
    if num_even < 0:
        return str(num_even + 10)
    else:
        return str(num_even)


n = input().split()
rst = []
if len(n[0]) > len(n[1]):
    n[1] = n[1].rjust(len(n[0]), '0')
if len(n[0]) % 2 == 0:
    for i in range(-1, -len(n[0]), -2):
        rst.insert(0, odd(n[0][i], n[1][i]))
        rst.insert(0, even(n[0][i-1], n[1][i-1]))
else:
    tmp = 0
    for i in range(-1, -len(n[0]), -2):
        tmp = i - 2
        rst.insert(0, odd(n[0][i], n[1][i]))
        rst.insert(0, even(n[0][i-1], n[1][i-1]))
    rst.insert(0, odd(n[0][tmp], n[1][tmp]))

if len(n[1]) > len(n[0]):
    rst.insert(0, n[1][:len(n[1]) - len(n[0])])

print(''.join(rst))

你可能感兴趣的:(PAT,Python)