无法解密Python算法

2024-10-02 12:34:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始学习python,虽然最好的方法是解决一些简单的算法问题。我遇到了一个问题:

从一本旧书中找到了一个奇怪的格子。它有5列和无限多的行。最下面的一行被认为是第一行。网格的前几行是这样的:

    ..............

    ..............

    20 22 24 26 28

    11 13 15 17 19

    10 12 14 16 18

    1  3  5  7  9

    0  2  4  6  8

网格永远向上生长! 从下到上索引行,从左到右索引列。 任务是在网格的rth行的cth列中查找整数。你知道吗

示例: 输入:6 3

输出:25

第6行第3列的数字是25。你知道吗

此问题的解决方案是:

import sys

for line in sys.stdin:
r = int(line.split(' ')[0])
c = int(line.split(' ')[1])

if r%2 == 1:
    print ((r-1)/2)*10 + (c-1)*2
else:
    print ((r-1)/2)*10 + (c-1)*2 + 1 

我不明白我们为什么要用r%2 == 1,为什么要用((c-1)*2)+1)+(((r-1)/2)


Tags: 方法算法网格示例sysline整数int
1条回答
网友
1楼 · 发布于 2024-10-02 12:34:19

看看那些奇数行。第一列中的值是0、10、20。第二列中的值是2、12、22。在第三、四、十四、二十四栏。你知道吗

现在只看偶数行。第一列中的值是1、11、21。第二栏:3,13,23。第三栏:5、15、25。你知道吗

你看到当你向上移动行时,值是如何增加10吗?不是每一排,而是每一排?这就是为什么我们有((r-1)/2)*10——首先我们把r取整到最接近的2的倍数,然后乘以10。这给了我们十位的值。你知道吗

再看奇数行。在第一行中,值是0、2、4、6、8。第三排:10,12,14,16,18。第五排:20、22、24、26、28。你知道吗

现在回到偶数行。在第二排我们有1,3,5,7,9。第四排:11、13、15、17、19。你知道吗

你看到行中,一位数的值增加了两个吗?对于奇数行,它们是偶数。在偶数行中,它们是赔率。这就是为什么我们要用if r%2 == 1:来检查我们是处理奇数行还是偶数行,以便处理这种分支行为。你知道吗

如果r是奇数,我们计算2的c-1次倍数-这就是(c-1)*2。另一方面,如果r是偶数,我们计算c-1乘以2加1(从而使值为奇数)。(c-1)*2 + 1。你知道吗

因为知道行号生成的值描述十位数,知道列号生成的值描述一位数,所以我们可以将这两个值相加。在r是奇数的情况下是((r-1)/2)*10 + (c-1)*2,在r是偶数的情况下是((r-1)/2)*10 + (c-1)*2 + 1。你知道吗

谢谢约翰的编辑建议!你知道吗

相关问题 更多 >

    热门问题