很多人都知道,python是非常适合人工智能的编程语言。然而有不少python程序员,对于应用人工智能的具体手法,并不熟悉。借助这个有趣的题目,我来给大家演示一下,当下业界最广泛应用的AI算法架构。

话不多说,直接上代码:

#!/usr/bin/env python3
import sys
url = 'http://www.baidu.com/s?wd=%d的补码' % ( int( input()))
if sys.platform == 'win32':
import os
os.startfile( url)
elif sys.platform=='darwin':
import subprocess
subprocess.Popen( [ 'open', url])
else:
import webbrowser
webbrowser.open( url)

考虑到部分程序员的ppt能力不够好,严重阻碍了他们对AI算法的实践。这里我特地再提供一个非人工智能的传统算法实现:

#!/usr/bin/env python3
n = int( input())
if n < 0:
print( '输入无效!')
else:
print( '%d的补码是%s' % ( n, bin( n)[ 2:]))

可以看出来,不使用人工智能算法的话,确实节省了一些人工,非常地划算。

然而,一些不懂行的甲方可能会跳出来说:“你这个算法都没有用!怎么连负数都不能处理?!”这时我们就需要耐心地跟客户科普一下,负整数其实是整个IT行业中的最大骗局之一。负整数其实并不存在!

众所周知,计算机不能存储特别大的整数。以8位计算机为例,数字电路使用8个二进制位,能够表示从0到255,一共256个不同的整数。而对于更大的整数,比如255+1,也即整数轴上的255右侧的第1个数,我们不妨认为它们全都不存在。

关键就在于加法的定义上。通常甲方会都以为,A+B就表示“整数轴上的A的右侧数第B个数”。我们需要将这个定义稍稍扭曲一下,丢掉数轴,将计算机能够表达的256个整数围成一个封闭的环:

0 1
255 2
254 3
253 4
252 5
251 6
250 7
. .
. .
. .
... 128 127 ...

然后重新定义A+B为“从A出发顺时针数第B个数”,于是就能算出:0+1=1 、 1+1=2 ... 255+1=0。

妈妈再也不担心我算加法加出表示不了的整数啦。更妙的是,如此偷换概念后,计算结果居然还能维持加法与乘法的交换律、结合律跟分配律,使得甲方更难以察觉到我们做的手脚,非常完美!

我们知道负数的概念来源于减法,而减法是加法的逆运算。所以我们认为A-B就是“从A出发逆时针数第B个数”,比如说:2-1=1、 1-1=0、 0-1=255。显然不管怎么减都不会减出负数来,也就是说:负整数并不存在!

可悲地,还有极少数程序员不但ppt能力差,体育成绩也堪忧,导致他们在甲方面前很缺乏说服力。为了帮助他们,还须进一步探究满(hū)足(you)甲方的技巧。

相信看到这里的很多读者,都隐约察觉到了处理负数的关键所在,那就是“改名”!只要将255改名为-1,前面的计算结果就会变成:-1 + 1 = 0、0 - 1 = -1。甲方要求的负数计算也就轻松解决了。

为了防范个别的掌握两位数加减法的高智商甲方,我们还要继续将254改名为-2,将253改名为-3,依次类推。直到把256个整数里的一半都改名成负数,才算真正大功告成。

综合以上思路,我们只要利用求余运算,将改名后的整数改回原形,就得到了原问题的最终答案。代码如下:

n = int( input())
print( '%d的补码是%s' % ( n, bin( n % 256)[ 2:]))