我刚开始学习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)
看看那些奇数行。第一列中的值是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
。你知道吗谢谢约翰的编辑建议!你知道吗
相关问题 更多 >
编程相关推荐