1048 数字加密 (20 分)

2023-11-09

题目描述:

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

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

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

输入样例:
1234567 368782971
输出样例:
3695Q8118


解题思路:
Alice: 这道题看起来挺普通的啊,怎么通过率这么低呢 ?
Bob: 人不可貌相啊,简洁不代表简单啊。ψ(*`ー´)ψ
Alice: 你觉得有哪些地方会有陷阱呢?
Bob: A B 位数不相等的时候,还有AB的输入会不会是13进制,还有100位的整数用C/C++的整型是存不下的。
Alice: 输入应该不会是13进制的,我们可以试一试。程序按照10进制去写( A = [int(x) for x in A[::-1]]),如果没有RE(run time error,运行时错误)就是10进制的。
Bob: 我们用Python写,不用担心整型变量会溢出的问题。而且我倾向于直接用字符串来存,然后直接把各个位拆开。
Alice: 恩,没有运行时错误,有两个WA(wrong answer, 答案错误)。有两个测试样例没过啊。
Bob: A B 位数不等的时候你怎么写的?
Alice: 对B加密,看案例如果A的长度小于B的长度的话,B多出来的高位可以直接不处理,接上去就好了。如果A的长度大于B的长度,直接按B的每位来就好了啊。
Bob: 我也是这样想的。既然是对B加密,A多出来的部分应该是没用的。真的WA了吗?给我看看代码。
Alice: (^ o^)/~,我想到一种简化的写法,A的长度小于B的长度的时候可以在A的前面加上一些零。如果A的对应位上是零,B对应位上的加密结果就是其自身。这和样例是相符的。
Bob: 会不会B的长度小于A的长度的时候也要在B的前面补上零啊?
Alice: 啊(キ`゚Д゚´)!!这么神奇嘛 (#゚д゚メ)
Bob: 没办法,好像没有别的选项了。虽然看起来不合常理,试一试吧。
Alice: 嘿,还真是这样,这题目。啧啧啧,辣鸡。
Bob: <(▰˘◡˘▰)


代码:

def main():
    A, B = (x for x in input().split())
    # 接收输入的两个字符串,A B。我们可以直接按照字符串来处理,其实这样反而更快一些。
    A = [int(x) for x in A[::-1]]
    # A 是一个整数列表,记录了A 从个位到最高位的每个数字。如 521 -> [1, 2, 5]
    B = [int(x) for x in B[::-1]]
    # 同上
    #如果A, B的长度不同就 把在它们前面补零,让它们的长度相等。
    if len(A) < len(B):
        A.extend([0] * (len(B) - len(A)))
    elif len(A) > len(B):
        B.extend([0] * (len(A) - len(B)))
    answer = []
    for x, _ in enumerate(B):
        # 对于B中的每一位数字,加密。
        if (x + 1) % 2 == 0:
            temp = B[x] - A[x]
            if temp < 0:
                temp += 10
        else:
            temp = (B[x] + A[x]) % 13
            if temp == 10:
                temp = 'J'
            elif temp == 11:
                temp = 'Q'
            elif temp == 12:
                temp = 'K'
        answer.append(temp)
    answer.reverse()
    # 我们从个位开始加密,但是要从最高位开始输出,所以需要翻转加密后的字符串。
    print(''.join([str(x) for x in answer]))
    # 拼接好答案,然后输出。


if __name__ == '__main__':
    main()


易错点:

  • 如果A 和 B的长度相等,按照题意处理即可。如果A的长度小于B的长度,按照样例我们可以在A的前面补上适当的零。这背后的逻辑是,如果A相应的位上是零,加密操作不会改变B对应位上的数字。 那么,疑问来了,如果A的长度大于B呢? 答案竟然(艹皿艹)是在B的前面也补上足够的零。加密操作改变了输入字符串的长度,恩,就是这样。

总结:

  • 我认为通过一些“毛病”来强行给题目增加难度的做法不可取。
  • 但是这样糟糕的题目就是存在,所以不要和一道题死磕。当然,和任何对象死磕都不好。

我想开了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1048 数字加密 (20 分) 的相关文章

  • python 中的错误 - “NoneType”类型的对象没有 len()

    我不确定我的 python 代码有什么问题 geneid request args get geneid sql text select from INFO where name ident genes engine execute sql
  • python 中 matlibplot 中散点图的缩放轴

    我正在使用 matlibplot 进行数据可视化 我的绘图共有 6502 个数据值 运行良好 但值接近且密集 例如 我的 y 轴值范围在 3 到 10 之间 我需要清楚地获取它们之间的每个点 即像 9 2 和 9 8 这样的值至少要以 1
  • (Python) 我应该使用参数还是将其设为全局参数? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有许多共享相同参数的函数 他们将多次输入和输出该参数 例如 a foo a fun a a bar a def fun a return a
  • 如何配置 VS Code 以便能够单步执行调试 Python 脚本时加载的共享库 (.so)?

    从命令行使用 gdb 我可以在加载共享库时中断 知道我有共享库的源代码 如何在 VS Code 中获得相同的行为 对我来说 它以某种方式起作用 这是我的设置 Ubuntu 18 04 调试我从 Python3 加载的 C 共享库 更具体地说
  • 将 for 循环转换为列表理解

    我有一个for循环 将字符串列表中每个元素的子字符串与另一个字符串列表中的元素进行比较 mylist for x in list1 mat False for y in list2 if x 14 in y mat True if not
  • 意外的缩进错误,但缩进看起来正确

    我一直在尝试运行此代码 但它引发了缩进错误 无论我尝试什么 结果都是一样的 如果我删除之前的缩进def str self 和代码的其余部分 它工作正常 但在输出时 它不显示问题 而是显示 问题对象 def str self Indentat
  • 加快 pandas groupby 中的滚动总和计算

    我想按组计算大量组的滚动总和 但我很难快速地完成它 Pandas 内置了滚动和展开计算器的方法 这是一个例子 import pandas as pd import numpy as np obs per g 20 g 10000 obs g
  • Flask / Werkzeug - 套接字卡在 CLOSE_WAIT 中

    我遇到过一种情况 API 构建于Flask 宁静 https github com flask restful flask restful间歇性变得无反应 目前它从 Werkzeug 运行 我知道它仅用于非生产用途 并且是单线程的 让事情变
  • 我怎样才能用Python中的语音识别来检测一个单词

    我知道如何用 Python 检测语音 但这个问题更具体 如何让 Python 只监听一个单词 然后如果 Python 可以识别该单词则返回 True 我知道 我可以让 Python 一直监听 然后做出类似的东西 伪代码 while True
  • Plotly:如何制作具有多条线和标准差阴影区域的图形?

    How can I use Plotly to produce a line plot with a shaded standard deviation I am trying to achieve something similar to
  • 按自定义年度频率重新采样

    我知道我可以使用 AS JUL 从 7 月 1 日开始每年重新采样 但在不同的日期之前我该如何做 In 11 df Out 11 value date 2005 07 02 4 2005 09 20 7 2005 11 12 4 2005
  • 查找提供的 Sum 值的组合

    我有一系列这样的数字 myvar 57 71 87 97 99 101 103 113 114 115 128 129 131 137 147 156 163 186 现在我想计算所有这些可能的组合 长度为1到20 其总和等于给定的数字m
  • 动态组装 Python 模块,动态导入

    我正在努力让自己熟悉importlib钩子 我想实现直接导入用其他语言编写的非Python文件并维护源映射的能力 因此提高SyntaxError带有行号的 s 仍然会给出有意义的堆栈跟踪 我加载外部文件的方法是组装 Pythonic 源代码
  • 确定 TCP Listen() 队列中当前积压的连接数

    有没有办法找出currentLinux 上 TCP 套接字上等待 Accept 的连接尝试次数 我想我可以在每个事件循环上点击 EWOULDBLOCK 之前计算成功的 Accept 数量 但我使用的是隐藏这些细节的高级库 Python Tw
  • 如何将字符串转换为二进制?

    我需要一种方法来获取 python 中字符串的二进制表示形式 例如 st hello world toBinary st 是否有一个模块可以以某种巧妙的方式执行此操作 像这样的东西吗 gt gt gt st hello world gt g
  • PyCrypto:生成受 DES3 密码保护的 RSA 密钥

    我已经能够使用 DES3 创建受密码保护的 RSA 密钥 嗯 I think因为我对这个加密世界非常陌生 使用以下命令 openssl genrsa out tmp myKey pem passout pass f00bar des3 20
  • 从 DST 感知日期时间对象在 Dataframe 中创建 pandas DatetimeIndex

    我从在线 API 收集了一系列数据点 每个数据点都有一个值和一个 ISO 时间戳 不幸的是我需要循环它们 所以我将它们存储在临时的dict然后从中创建一个 pandas 数据帧并将索引设置为时间戳列 简化示例 from datetime i
  • 从 Python 调试 C 库 (ctypes)

    我有一个使用 ctypes 和 C 共享库 dll 文件 的 Python 程序 作为 IDE 我使用 Eclipse 其中将开发两个项目 C 共享库和使用它的 python 程序 我的想法是 当我在调试模式下启动Python程序时 我可以
  • 无法使用 pandas 获取平均日期

    我有一个时间序列数据集 我想从中获取平均日期 这是一个人为的示例 显示 pandas datetime64 对象的溢出错误 import pandas as pd import numpy as np rng pd date range 2
  • Discord-py Rewrite - Cog 中的基本 aiohttp Web 服务器

    我正在尝试将基本的 aiohttp 网络服务器集成到 Cog 中 使用 discord py 重写 我对齿轮使用以下代码 from aiohttp import web import discord from discord ext imp

随机推荐