这个算法背后的逻辑是什么?

时间:2018-02-12 00:19:47

标签: python python-3.x algorithm graph modulus

可以在@ http://www.cemc.uwaterloo.ca/contests/computing/2017/stage%201/juniorEF.pdf发现对此问题的解释 (这是第三个问题,标题为#34;完全是电气")。

def electrical(a,b,c,d,e) :
  charge = e
  x_dif = abs(c - a)
  y_dif = abs(d - b)
  total_dif = (x_dif + y_dif)

  if (((total_dif) == charge) or ((total_dif % 2 == 0) and (charge %2 == 0)) or ((total_dif % 2 != 0) and (charge % 2 !=0))) :
    return "Y"
  else :
    return "N"

print(electrical(10,2,10,4,5))

此代码也可以在https://repl.it/@erichasegawa/2017-CCC-Junior-S3找到。

我本周正在学习写加拿大计算机竞赛,我对他们的一个算法有疑问;为什么我的功能会回归" Y"当电荷和距离均匀或不均匀时,如果一个是偶数而另一个不是(反之亦然)则返回假。我知道这有效,但我不知道 为什么或如何 它的工作原理。如果有人可以解释这将是伟大的。

2 个答案:

答案 0 :(得分:1)

细分条件:

if (((total_dif) == charge) or ((total_dif % 2 == 0) and (charge %2 == 0)) or ((total_dif % 2 != 0) and (charge % 2 !=0)))

我们有......

(total dif == charge) # they are equal, so either both odd or even

or ((total_dif % 2 == 0) and (charge % 2 == 0)) # if their remainder after division by 2 is 0, then they're both even 

or ((total_dif % 2 != 0) and (charge % 2 != 0)) # if their remainder after division by 2 is NOT 0, then they're both odd

请注意,第一个条件是不必要的;我们已经检查过两者是否均匀,或者两者是否都是奇数。拥有或删除不应该改变程序的行为。

另请注意," total_dif"周围的括号组合是不必要的,使一个已经很大的条件更难以阅读。实际上,您应该将表达式拆分为不同的部分,可能作为变量both_even和both_odd,然后检查

if (both_even or both_odd)

更具可读性

答案 1 :(得分:0)

您的代码状态

if (((total_dif) == charge) or ((total_dif % 2 == 0) and (charge %2 == 0)) or ((total_dif % 2 != 0) and (charge % 2 !=0))) :

第一个条件

(total_dif == charge)

正在确定电荷是否等于所需的距离,因此两者都是偶数还是奇数。

第二个条件

((total_dif % 2 == 0) and (charge %2 == 0))

检查两个参数的余数(电荷和距离)除以2是否为偶数(%运算符);它正在检查它们是否都是偶数。

您的第三个条件恰好相反,它将检查它们是否均为奇数。

实质上,您的条件是检查电荷和距离之间的差是否可被2整除,因为您可以进行两次U型转弯以抵消这一均等的盈余。

因此,您的条件可以简化为

if ((charge-total_dif) % 2 == 0):

您的问题在技术上与该问题无关,因为如果一个论点是偶数而另一个论点是奇数,则您将有一个赤字的盈余。总是。

您的代码唯一的另一个问题是,它永远不会检查费用是否大于或等于距离

这意味着您可以在0电荷的情况下获得偶数距离n(例如28321728932)并仍返回“ Y”,或者在3电荷的情况下获得奇数距离x(例如3121)并仍返回“ Y”。

因此,您应该包括条件

charge >= total_dif

在您的代码中。

总而言之,您的情况应该是

if ((charge >= total_dif) and ((charge-total_dif) % 2 == 0):

最后的提示:请使用较短的变量名。在像您这样的简短程序中,您可以轻松区分短名。