编程真难啊

2009年9月3日 发表评论 阅读评论 48,600 人阅读    

上周,在Sun的Java论坛上出现了一个这样的帖子,这个贴子的链接如下:
http://forums.sun.com/thread.jspa?threadID=5404590&start=0&tstart=0

LZ的贴子翻译如下:

大家好,我是一个Java的新手,我有一个简单的问题:请问我怎么才能反转一个整数的符号啊。比如把-12转成+12。是的,毫无疑问这是个简单的问题,但我弄了一整天我也找不到什么好的方法。非常感谢如果你能告诉我Java有什么方法可以做到这个事,或者告诉我一个正确的方向——比如使用一些数学库或是二进制方法什么的。谢谢!

这个贴子的沙发给出了答案:

n = -n;

LZ在四楼回复到:

我知道是个很简单的事,可我没有想到居然这么简单,我觉得你可能是对的。谢谢你。

过了一会,又回复到:

不开玩笑地说,我试了,真的没有问题耶!

看到这样的贴子,就能想到国内论坛上很多这样的“问弱智问题的贴子”,结果可能都会是比较惨!是的,国外的互联网文化和国内差不多,都是恶搞的人多于热心的人,呵呵。不过,国外的网民们有一点是好的,再恶搞也是就事搞事,不会有侮辱人的语言,这点真是值国内的人学习

这本是一个平淡无奇的贴子,不过回复中那些恶搞的“解决方案”太强大了,在这里例举一下吧。

贴子的板凳给出了这样的答案(这是恶搞的开始)

 

int x = numberToInvertSign;
boolean pos = x > 0;
for(int i = 0; i < 2*Math.abs(x); i++){
    if(pos){
        numberToInvertSign--;
    }
    else{
        numberToInvertSign++;
    }
}

然后,有人说,n = -n 可以是可以,但不够晦涩,于是一个晦涩的解决方案出现了:

int n = ....;
 n = (0xffffffff ^ n) + 1;

然后,又出现了一些看似简单,其实是比较晦涩的方案

n = ~n + 1; 

 

n = ~--n; 

 

继续,有才的人从来就不少:

n^= 0xffffffff;
int m;
for (m= 1; m != 0 && ((n&m) != 0); m<<= 1);
n|= m;
if (m == 0) n= m;
else for (m >>= 1; m != 0; n^= m, m>>=1);

 

呵呵,开始越来越强大了,我以前也向大家介绍过《如何加密/弄乱C源代码》的文章,和这些恶搞的人可能有点相似吧。上面这个例子一出,大家都在讨论上面例子中的for循环语句,呵呵,很费解啊。

然后,后面几个就开始乱来了:

public int invert(int i) {
  return i - (i + i);
}
switch (i)
{
  case 1: return -1;
  case 2: return -2;
  case 3: return -3;
  // ... etc, you get the proper pattern
}

不过事情还没有结束,看看下面这个吧,OMG。

int absoluteValue(int num)
{
 int max = 0;
 for(int i = 0; true; ++i)
 {
  max = i > max ? i : max;
  if(i == num)
  {
   if(i >= max)
    return i;
   return -i;
  }
 }
}

 还有用字符串的解决方案:

public int invert(int n) {
    String nStr = String.valueOf(n);
 
    if (nStr.startsWith("-")) {
        nStr = nStr.replace("-", "");
    } else {
        nStr = "-" + nStr;
    }
 
    return Integer.parseInt(nStr);
}

别忘了面象对象,有最新Java支持的模板库: 

public interface Negatable<T extends Number> {
  T value();
  T negate();
}
 
 
 
public abstract class NegatableInteger implements Negatable<Integer> {
  private final int value;
 
  protected NegatableInteger(int value) {
    this.value = value;
  }
 
  public static NegatableInteger createNegatableInteger(int value) {
    if (value > 0) {
      return new NegatablePositiveInteger(value);
    }
    else if (value == Integer.MIN_VALUE) {
      throw new IllegalArgumentException("cannot negate " + value);
    }
    else if (value < 0) {
      return new NegatableNegativeInteger(value);
    }
    else {
      return new NegatableZeroInteger(value);
    }
  }
 
  public Integer value() {
    return value;
  }
 
  public Integer negate() {
    String negatedString = negateValueAsString ();
    Integer negatedInteger = Integer.parseInt(negatedString);
    return negatedInteger;
  }
 
  protected abstract String negateValueAsString ();
}
 
 
 
public class NegatablePositiveInteger extends NegatableInteger {
  public NegatablePositiveInteger(int value) {
    super(value);
  }
 
  protected String negateValueAsString () {
    String valueAsString = String.valueOf (value());
    return "-" + valueAsString;
  }
}
 
 
 
public class NegatableNegativeInteger extends NegatableInteger {
  public NegatableNegativeInteger (int value) {
    super(value);
  }
 
  protected String negateValueAsString () {
    String valueAsString = String.valueOf (value());
    return valueAsString.substring(1);
  }
}
 
 
 
public class NegatableZeroInteger extends NegatableInteger {
  public NegatableZeroInteger (int value) {
    super(value);
  }
 
  protected String negateValueAsString () {
    return String.valueOf (value());
  }
}

 

这个贴子基本上就是两页,好像不算太严重,如果你这样想的话,你就大错特错了。这个贴子被人转到了reddit.com,于是一发不可收拾,在上面的回贴达到了490多条。链接如下:

http://www.reddit.com/r/programming/comments/9egb6/programming_is_hard/

有人说,要用try catch;有人说要使用XML配置文件……,程序员们在追逐更为变态和疯狂的东西,并从中找到快乐,呵呵。

看完后,正如reddit.com所说——“编程好难啊”!

无独有偶,这并不是第一次,也不会是最后一次,让我们看看在PHP的官网上发生的类似的一幕——讨论PHP的abs取绝对值函数的函数说明文档中的回复:

http://us.php.net/manual/en/function.abs.php#58508

又是一个长贴,还带着很多性能分析,真的很好很强大!

(全文完)

好烂啊有点差凑合看看还不错很精彩 (56 人打了分,平均分: 4.89 )
Loading ... Loading ...
  1. ( ⊙ o ⊙ )啊!
    2009年9月4日01:38 | #1

    变态啊变态。某数学大师研究一辈子 1+1 呢,岂不是更变态?

  2. 2009年9月4日09:24 | #2

    可见编的不是程序,是寂寞。

  3. 2009年9月4日09:24 | #3

    呵呵,这么个问题都能引出一大堆人千奇百怪的回复。

  4. L
    2009年9月4日10:08 | #4

    @( ⊙ o ⊙ )啊!
    弄懂 1+1 的确切含义先

  5. 2009年9月4日10:53 | #5

    Programming is hard, let’s go shopping!

  6. 2009年9月4日11:40 | #6

    Atwood’s Law: any application that can be written in JavaScript, will eventually be written in JavaScript.
    http://www.codinghorror.com/blog/archives/001296.html

    so this is how to implement in javascript:

    var NegatableInteger = (function(){
    var publicObj = {
    invert: function(n){
    if (n === undefined) {
    n = this.cache;
    } else if (n + this.cache === 0) {
    this.init(n);
    return n;
    }
    return arguments.callee.call(this, this.progress(n));
    },
    init: function(n){
    this.cache = n;
    this.progress = n > 0 && (function(n){
    return n – 1;
    }) || (function(n){
    return n + 1;
    });
    }
    };
    return function(n){
    var tmp = function(){};
    tmp.prototype = publicObj;
    var obj = new tmp();
    obj.objectId = “NI” + +new Date();
    obj.init(n);
    return obj;
    };
    })();

    NegatableInteger(12).invert(); //-12
    var newInteger = NegatableInteger(-12);
    newInteger.invert(); //12
    newInteger.invert(); //-12

  7. younger
    2009年9月4日13:18 | #7

    @L
    同意!

  8. hallo
    2009年9月5日12:06 | #8

    不懂就不要乱说,你自己好好查查1+1指的是什么?不要想当然。@( ⊙ o ⊙ )啊!

  9. ostric
    2009年9月5日13:31 | #9

    charlie :可见编的不是程序,是寂寞。

    ——哈,精辟啊,不过这大抵也是编程的一大乐趣吧

  10. phidoit
    2009年9月6日12:52 | #10

    @( ⊙ o ⊙ )啊!
    某数学大师只研究出了1+2=2,还没研究出1+1=2呢

  11. booster
    2009年9月8日16:01 | #11

    @( ⊙ o ⊙ )啊!
    民科们总以为哥德巴赫是证明1+1=2的
    不过跟他们说素数恐怕他们也听不懂

  12. ddy
    2009年10月9日12:43 | #12

    最怕绕远路了

  13. 阿拉
    2009年11月23日14:33 | #13

    唉,1+1是哥-筛法的终极命题
    1+2离最后的结果,还远得很!

    另外,反正我是没听说过1+2=2是个什么命题~

    最后:无知跟弱智是两回事,但是很多时候,看起来很像!!

  14. 吃饭睡觉打豆豆
    2009年11月24日19:21 | #14

    豆豆们都太无聊~~

  15. y_public@yahoo.cn
    2010年1月30日14:27 | #15

    程序员真寂寞~

  16. 古歌
    2010年2月1日22:34 | #16

    编程=!(1^(编程==难?不难:难))

  17. 2010年5月14日21:39 | #17

    看来,程序员都很幽默。

  18. 2010年5月15日12:44 | #18

    @( ⊙ o ⊙ )啊!
    哥德巴赫猜想不是你yy的1+1…

  19. ohmy
    2010年5月15日16:54 | #19
  20. delr
    2010年5月16日04:43 | #20

    复杂程度都比不上

    Just another Perl hacker

  21. 2010年6月3日13:33 | #21

    其实,就是这样,国内的氛围确实不强,如果觉得简单,就可以多搞些好玩的来

  22. Tydus
    2010年6月15日10:29 | #22

    蛋疼的程序员们啊……
    话说Vijos上有各种A+B Problem的高等解法……(貌似有用微积分的,网络流,位运算一类……)

  23. 2010年6月23日19:40 | #23

    看来得个答案也挺难的:)

  24. 梁子
    2010年7月7日23:24 | #24

    有才

  25. 2010年7月12日16:09 | #25

    太强大了

  26. hitsmaxft
    2010年7月27日00:26 | #26

    好好玩的帖子

    在这帖子的回复里,我看到了作者所说的国外的网民和国内网民的差别

  27. 2010年8月5日05:01 | #27

    看到这样的贴子,就能想到国内论坛上很多这样的“问弱智问题的贴子”,结果可能都会是比较惨!是的,国外的互联网文化和国内差不多,都是恶搞的人多于热心的人,呵呵。不过,国外的网民们有一点是好的,再恶搞也是就事搞事,不会有侮辱人的语言,这点真是值国内的人学习。
    =========
    我不同意,国内正经对问题回答的人一定不会少,恶搞的也不会少
    但骂人的有,却一定不像您估计的”有很多”!
    无非就是语重心长的长辈老鸟口吻说”多学点基础”之类的话
    (我想程序员里面 随口就骂人的根本很少吧,我是没见过程序员论坛里有地域攻击的事情!)

  28. 2010年8月27日16:43 | #28

    写个程序不容易啊~

  29. qci133
    2010年9月5日22:41 | #29

    @( ⊙ o ⊙ )啊! 大哥你这个理解。。。还真以为就是你小学一年纪学1+1=2啊?其实这个无知也不是你的错,都是媒体瞎宣传导致的。

  30. 新手
    2010年10月13日13:17 | #30

    @bob
    很常见好不好

  31. bitwjg
    2010年10月26日12:40 | #31

    呵呵 编程从来就不是一件容易的事

  32. topin27
    2010年10月28日15:31 | #32

    豆豆什么的最寂寞了

  33. momo-erika
    2010年11月20日22:04 | #33

    大师们玩腻了,开始研究1+1了,从C++之父批“把C++称为面向对象语言”和STL之父说“面向对象和人工智能一样,是个骗局”开始

  34. 菠萝
    2010年12月13日19:46 | #34

    那个for循环是利用signed int的溢出吧?

  35. element
    2011年1月27日16:33 | #35

    这不是一个正确的解释。。

  36. 2011年3月18日11:28 | #36

    @( ⊙ o ⊙ )啊!
    此1+1,非彼1+1,呵呵。
    —–以下系引用—–

    真正的哥德巴赫猜想,完整的表述是这样的:(1)任何一个大于2的偶数都能表示成两个素数之和;(2)任何一个大于5的奇数都能表示成三个素数之和。这就是哥德巴赫猜想的完整表述。很明显,任何一个大于大于5的奇数都可以写成3加上一个大于2的偶数的和,所以哥德巴赫猜想中的(2)只是(1)的一个推论。因此哥德巴赫猜想在数学界有一个特定的代号就是“1+1”,请注意,这个代号是“1+1”,而不是“1+1=2”,更不是“1+1=?”。证明了哥德巴赫猜想并不能证明1+1=2,而1+1=2这个等式也和哥德巴赫猜想毫无关系,这才是真相。
    陈景润所证明的陈氏定理也就是“1+2”的完整表述是这样的:一个充分大的偶数,是可以表示成一个素数与另一个素数的和,或者是一个素数与另两个素数乘积的和。1977年,徐迟的一篇科学报告文学——《哥德巴赫猜想》,把一个名字叫做陈景润的中国数论研究者和哥德巴赫猜想联系到了一起。在那篇著名的报告文学里,徐迟用他文人浪漫,夸张而又显得无比外行的口吻宣称:陈景润所证明的“1+2”距离“哥德巴赫猜想“仅一步之遥”。呵呵,这是怎么样的“一步之遥”啊!陈景润的同学,著名的中国当代数论专家王元这样论断“这一步大的不得了”,其的距离或许要比之前所走过的所有路程都要远。

  37. erinwon
    2011年4月2日14:57 | #37

    以小见大,哈哈

  38. 2011年4月2日18:59 | #38

    难, 只是对于一般的人来说的!

  39. zhang
    2011年4月4日12:00 | #39

    OMG,我居然想的是乘-1。

  40. Oliviaxu
    2011年4月12日11:30 | #40

    笑死啦~~好欢乐~~~~

  41. 夜痕
    2011年6月3日11:50 | #41

    程序猿总归是寂寞的嘛。。。其实论坛上好像没看过问问题然后人身攻击的事情-,-

  42. 乐与怒
    2011年6月3日21:14 | #42

    自从遇到一个姑娘,就不想再搞技术了..

  43. Walkerinwind
    2011年6月4日22:18 | #43

    乐与怒 :
    自从遇到一个姑娘,就不想再搞技术了..

    当沉溺于技术的时候,谁还管姑娘?

  44. RaidNight
    2011年7月12日11:05 | #44

    当沉溺于的姑娘时候,谁还管技术?

  45. 2011年7月24日18:18 | #45

    我的妈呀
    n = 0 – n;
    不就行了?

  46. 2011年7月24日18:23 | #46

    @zhang
    不对吗?

  47. A.long
    2011年7月25日16:59 | #47

    @Seamlik

    自己都不能非常肯定吗?

  48. prayer
    2011年8月8日18:13 | #48

    我彻底震惊了……看来恶搞也是一种学习方式,O(∩_∩)O哈哈~

  49. 哈哈西
    2011年8月18日15:56 | #49

    C++是一种可以进行面向对象编程的语言,但不是只能进行面向对象编程啊!

  50. 一言一行
    2011年11月10日18:00 | #50

    呵呵! 老外确实做事比较讲究方法!

评论分页
1 2 1391
  1. 2009年11月9日08:20 | #1
  2. 2010年5月14日08:51 | #2
  3. 2010年5月24日11:25 | #3
  4. 2010年8月31日17:21 | #4
  5. 2010年12月30日00:57 | #5
  6. 2011年4月2日15:10 | #6
  7. 2011年4月2日23:58 | #7
  8. 2011年4月4日12:30 | #8
  9. 2011年4月26日21:30 | #9
  10. 2011年6月3日10:43 | #10
  11. 2011年6月5日10:47 | #11
  12. 2011年6月10日08:46 | #12
  13. 2011年6月10日09:34 | #13
  14. 2011年6月10日10:33 | #14
  15. 2011年6月13日22:24 | #15
  16. 2011年7月9日03:08 | #16
  17. 2011年7月25日10:23 | #17
  18. 2011年7月25日16:02 | #18
  19. 2012年1月6日09:58 | #19

无觅相关文章插件,快速提升流量