趣题:只用赋值、自增和循环操作实现减法运算
icon2 Program Impossible | icon4 2008-10-22 0:36| icon318 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.com

  网友Mingliang Zhu在TopLanguage上发起提问。

  设想这样一个计算机系统,它只支持以下几个操作:
    1. 定义变量、给变量赋值;
    2. 变量自身加一;
    3. 令一段语句循环执行指定的次数。
  这个系统只处理且只能处理0和正整数。系统不存在“溢出”的问题。
  注意这个系统没有比较运算,事实上它甚至不存在Boolean值和判断语句。
  循环语句也不是FOR i=a TO b DO的形式,只能是LOOP n的形式。

  在这个系统上实现加法很容易,让a自增b次即可。现在的问题是,你能在这个系统上实现减法吗?


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  问题的关键在于如何实现自减一操作。
  本来让-1自增n次即可实现n的自减的,但系统偏偏又不支持负数。
  网友Dingding给出了一个答案:

tmp = 0
result = 0
loop(n) {
   result = tmp
   tmp++
}

  这段代码执行后,result的值将变为n-1。注意到这段代码在自增时是如何巧妙地延迟了一步的。
  现在,我们相当于有了自减一的函数dec。实现a-b只需要令a自减b次即可:

result = a
loop(b) {
   dec(result)
}

18 条回复

  • 楼层: 沙发 | | welco 说:

    a-b
    =b自增到a的次数

  • 楼层: 板凳 | | 夜弓 说:

    回复:welco
    a-b
    =b自增到a的次数
    关键是没有for(i=a; i<b;++i)这样的循环
    只能loop(n)

  • 楼层: 地毯 | | Wei 说:

    设想这样一个计算机系统,它只支持以下几个操作:
    1. 定义变量、给变量赋值;
    2. 变量自身加一;
    3. 令一段语句循环执行指定的次数。

    dec函数哪来的...

  • 楼层: 地板 | | lyc 说:

    这次百度的面试就问了这个题。。
    出的很不错。。。

  • 楼层: 地下室 | | Ttxu 说:

    一直加啊加……直到撑破上界为止,这样是不是也可以实现……研究ing……

  • 楼层: 地基 | | Ttxu 说:

    额,不存在溢出。。。

  • 楼层: 地壳 | | Assassin.cpy.pku 说:

    恩..在TP上看过了..无限强大的

  • 楼层: 地幔 | | multiple1902 说:

    嗯 这个延迟一步的思路很强大!

  • 楼层: 地核 | | hetong_007 说:

    这种题目初看起来总是很吓人~

  • 楼层: 10楼 | | shellex 说:

    我昨天也看到这题了。

  • 楼层: 11楼 | | Perry 说:

    汗,在toplanguage上提问的人貌似就是我……

  • 楼层: 12楼 | | zmq 说:

    如果只有这三种语句的话,根本不可能去实现dec函数的啊。这个dec函数用的很暧昧!

  • 楼层: 12a楼 | | mincomp 说:

    这个题牛逼就牛逼在他可以做除法

  • 楼层: 14楼 | | 晓而不羽 说:

    loop(b){
    tmp = 0
    res = 0
    loop(a){
    res = tmp
    tmp++
    }
    a = res
    }
    整个复杂度是O(a*b)。

  • 楼层: 15楼 | | bmrs 说:

    这种系统处理A-B时,只有当A>=B时才会有正确的结果吧? 当A<B时,结果也为0? 因为处理不了负数,或者说对0做des操作时,结果还是0

  • 楼层: 16楼 | | Matrix67: My Blog » Blog Archive … : 无为驿站 说:

    [...] 趣题:只用赋值、自增和循环操作实现减法运算 [...]

  • 楼层: 17楼 | | Lamdy 说:

    除法能否这么做?

  • 楼层: 18楼 | | pochy 说:

    这个类似于丘奇数了

您也随便说几句吧:

您可以在 Gravatar 设置您的头像。