3
30
2013
51

负整数的整除和取余运算

负整数间是怎么整除和取余数的呢?

数学上貌似没定义,但计算机确实能算。于是就试了试,想总结一下规律。

一不小心发现,C/C++ 和 Python 下的结果是不同的:

  C/C++ Python 精确值
-14/3 -4 -5 -4.67
-14%3 -2 1 /
14/-3 -4 -5 -4.67
14%-3 2 -1 /
-14/-3 4 4 4.67
-14%-3 -2 -2 /

总结规律如下:

  1. 两种语言中,商和余数都符合 被除数=商x除数+余数 这一数学规律。
  2. 两种语言中,整除的方法不同:C/C++ 是向零取整(负数向上、正数向下取整),Python 是下取整

 

以 n/3 和 n%3 为例,看看这两种处理方法的区别。

C 的情况,两种运算结果都关于0对称和反号

n -5 -4 -3 -2 -1 0 +1 +2 +3 +4 +5
-1 -1 -1 0 0 0 0 0 1 1 1
余数 -2 -1 0 -2 -1 0 1 2 0 1 2

Python 的情况,运算结果是完全连续的:

n -5 -4 -3 -2 -1 0 +1 +2 +3 +4 +5
-2 -2 -1 -1 -1 0 0 0 1 1 1
余数 1 2 0 1 2 0 1 2 0 1 2

不知道那种在数学上更好用。个人觉得 Python 的处理方式更优美一些吧。

 

至于其他语言的处理方法,应该也出不了这两种。我所知道的:

  • C/C++ “向零取整式整除”:C/C++、Java、bash
  • Python “下取整式整除”:Python、Perl、Lua
Category: 计算机 | Tags: python c/c++ 编程 数学
12
26
2011
7

异常:try vs finally,程序控制权的争夺

经典代码(同样适用于Java、JavaScript):

def lol():
    try:
        return True
    finally:
        return False

调用lol()后,究竟是返回False还是True呢?相信你和我一样,最开始认为是True,因为try中的语句先执行,对吧?

但事实上:

>>> lol()
False

try had a try. Finally, finally won.

所以,不要在异常语句中用return……

Category: 计算机 | Tags: python 编程 异常
9
10
2011
17

让中学生学 Visual Basic 简直害人

我国的中学信息学教育,教的编程语言是Visual Basic。我觉得,虽然VB学起来简单,但用VB入门就是坑害小童鞋啊。

其一,VB上来就是GUI编程,掩盖了很多的编程基础知识。学了VB的同学,看到我用C语言写出来的“DOS程序”,还觉得十分落后。恐怕初学者学了VB后,实在是无法接受其他“只能写出DOS程序”的语言了吧。

其二,VB宽松的语法不利于培养编程习惯。VB不用声明变量,又是弱类型,字符串都能和数字相加,给了编程者太多的自由。过度宽松的语法,可能导致各种意想不到的问题。编程习惯的重要性,就不多说了吧……

其三,VB是Windows-only的(虽然有个gambas什么的移植VB到Linux,但可以忽略之)。真正的程序员,不能烂到Windows一辈子吧。学个C/C++、Python什么的,好歹也到处能用。

其四,VB发展前景不好。微软都抛弃VB了,开发另一个貌似也很垃圾的VB.net了,我们却还在学VB。没准儿Windows 8就不支持VB了…… 就算烂到Windows一辈子尚可忍受,也不能烂XP上吧。

其五,Visual Basic编译器(就这么叫吧)是收费软件。虽然这是天朝,百度一下D版到手。但做大项目,用个D版不合适吧。全国学校都装D版VB,更不合适吧。

 

强烈建议使用Python代替VB,作为中学生学习编程的入门语言。Python要简单足够简单,要严格足够严格,要强大足够强大,有免费的跨平台解释器(手机能用,Win能用,Mac能用),很适合作为第一门编程语言学习。

Category: 计算机 | Tags: BASIC 编程 Windows Python

| Theme: Aeros 2.0 by TheBuckmaker.com