编程碰到这样一个需求:
将十个月前,五个月后的口语化的月份基于当前月转换为准确的年月。
向后比较好办,比如当前为2019年9月,则五个月后为:
月份为:(9-1+5)%12+1=2
年份为:2019+(9-1+5)//12=2020
其中的-1操作是因为在取余运算时,9月对应的是8。取余运算完了,还得加回去。
向前看起来有点麻烦,当前仍为2019月9月,如果说10个月前,怎么计算呢?先说答案:
月份为:(9-1-10)%12+1=11
年份为:2019+(9-1-10)//12=2018
可以看出两者的公式是一模一样的,原因在于%,//的计算公式。
%的公式:r=a-n*[a//n] 其中a为被除数,n为除数,r为余数
//的公式:向下取整(a/n)
秘密在就于公式:r=a-n*[a//n],他的变形a=n*[a//n]+r,也就是说,无论a是正数或者负数,通过%,//,计算出的商和余数,总是能还原出原先的数。同时余数还总为正值,所以用于上面的月份计算非常方便。
以上相当于实现了十二进制的运算。
扩展一下,使用%,//应该可以实现任何进制的运算。
%,//的使用介绍参考:https://blog.csdn.net/sun___M/article/details/83142126