编程真难啊

编程真难啊

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

LZ的贴子翻译如下:

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

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

n = -n;

LZ在四楼回复到:

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

过了一会,又回复到:

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

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

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

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


1

2

3

4

5

6

7

8

9

10

int x = numberToInvertSign;

boolean pos = x > 0;

for(int i = 0; i < 2*Math.abs(x); i++){

    if(pos){

        numberToInvertSign--;

    }

    else{

        numberToInvertSign++;

    }

}

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


1

2

int n = ....;

 n = (0xffffffff ^ n) + 1;

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


1

<code>n = ~n + 1; </code>


1

<code><code>n = ~--n; </code></code>

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


1

2

3

4

5

6

7

<code><code>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);

</code></code>

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

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


1

2

3

public int invert(int i) {

  return i - (i + i);

}


1

2

3

4

5

6

7

switch (i)

{

  case 1: return -1;

  case 2: return -2;

  case 3: return -3;

  // ... etc, you get the proper pattern

}

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

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;

  }

 }

}

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


1

2

3

4

5

6

7

8

9

10

11

public int invert(int n) {

    String nStr = String.valueOf(n);

 

    if (nStr.startsWith("-")) {

        nStr = nStr.replace("-", "");

    } else {

        nStr = "-" + nStr;

    }

 

    return Integer.parseInt(nStr);

}

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

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

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

(全文完)

时间: 2024-12-29 23:52:52

编程真难啊的相关文章

【我所认知的BIOS】—&amp;gt; uEFI AHCI Driver(4) — 第一个Protocol真难搞

[我所认知的BIOS]-> uEFI AHCI Driver(4) - 第一个Protocol真难搞 LightSeed 4/23/2014 文章对EFI_DRIVER_BINDING_PROTOCOL的每一个 成员的解说是重点.它是我们遇到的第一个uEFI里面的protocol所以我都尽量把它讲的够细.下一篇文章開始就真正进入到install protocol的函数里面去了. [右键点击图片,在新窗体打开是能够放大看的] [我所认知的BIOS]-> uEFI AHCI Driver(4) -

为什么很多大学生都会觉得编程很难?

现在大学常见的情况就是进入计算机专业就读的学生,最初至少有一大半对真实的软件开发完全不了解,是"一张白纸".不幸的是,学了四年之后,许多张"白纸"又变成了许多罐"浆糊",带着对软件开发可能是畏惧,也可能是无所谓,但绝对不是喜欢的感触离开校园. 编程真的那么没劲?那么难和枯燥?其实编程的看法可总结为两句:何以解忧,唯有编程!编程其实是很有趣很好玩很实用并很有成就感的一件事,为什么会有这么多的学生觉得编程很难?问题在于学习过程中的"正向&q

个人经历:IT专业找工作真难

面临实习了,才发现各个专业的找工作都挺容易的,但是我们IT专业呢?想找个php程序员工作,首先是不容易找,然后就是要求高,最后还来个要求1-3年工作经验.在学校学习的本来就有些和社会有些脱轨,其实就真心学个基础(当然也不排除少数天才很牛).热爱编程的人,出来实习,不谈求薪资优厚,不怕辛苦,肯学,从实习生做起,一边工作一边学习,但也少有这种机会的.IT技术人员入行就真那么难么?困惑.

编程问题难解决,学会提问是关键!

引言:自学编程是个困难的事情,因为你可能找不到人来帮你解决编程问题.幸运的是,我们有互联网,所以尽管你个人并不认识任何程序员,你还是可以向真人提问编程问题,并且得到真实的(好)答案.不过获得问题答案的关键在于在什么地方.什么时间,以及如何问问题.本文选自<一路编程>. 什么地方 找到正确的地方问编程问题可能和问对问题一样重要.如果你跟错误的人问了正确的问题,也许得到了答案,但你不会得到一个好答案.因为你想要一个好答案,就需要知道在哪里问问题. 1. 打电话给朋友 如果你是因为没人教你.指导你或

编程到底难在哪里?

我的看法:程序员的核心技能是短期记忆力 (short term memory [wikipedia] - Short-term memory is the capacity for holding a small amount of information in mind in an active, readily available state for a short period of time.),这也是区别一个优秀程序员和普通程序员的重要指标. 程序员需要学习很多新东西:程序语言的原理.

找个小伙伴可真难!

情况说明:小公司,app外包,已经开发完成95%,本身有电视和移动电视资源,客户资源也有,想法也有. 想找个偏重运营方面的小伙伴,当然,因为是起步阶段,各方面条件都比较有限,所以需要不仅仅只懂运营,很多事情需要配合搭档去完成,具体要求可以联系我详细了解. 广泛一点讲,就是希望找一个互联网(编程.推广.运营.编辑.策划等)各方面都接触过并有一定了解的小伙伴,不要求精通甚至非常熟练的地步,但至少要知道怎么去做. 还有重要的几点补充一下:需要有很强的责任心,志同道合者,能把工作当做事业来做:有过创业经

【2019-07-16】如果自己觉得难,就真难

07:55 每天喝半个小时的茶再执笔写上两句,是一件很享受的事情.如果时间允许,半小时的茶思和半小时的记录实在少得可怜,至少再来一到两倍的时间才能满足. 很多时候,我拿笔前想写的那句话和拿笔写下的第一句是完全不一样的.我每天都会用手机“记事本”软件记下每一个想要思考.想要留念.想要记录的瞬间感受,两三字即可,不用多.但每天早上静坐半小时后想要写上昨天所记录的时候,这半小时的思绪全部涌现出来,最终结果是:昨天记录的,一个字都没写上. 时间真的不够用,每天再多给我两小时,我可以写数千字的日常和感受.

自学编程很难,求助&#183;&#183;&#183;&#183;&#183;

为了兑现承诺,也为了自己的一种思考方向——去找到思想的本质——我认为思想的本质就是程序与逻辑,因此,我就必须会应用“程序及其编写程序”,到了今天,自己才迈出一步,到网上搜索了不少的有关编程入门的知识,与网站. 由此注册了两个身份,以便于更好地运用那个网站的资源,有机会能够互动和求助.难度是不小的. 其一,这不是将简单地运用英语与数学.很多的英语单词,也许尝试几次,可以记住,实际上,计算机语言的所需最基本的英语单词,恐怕不下于200个,单单迈过此关,就要花几天吧. 其二,自学是极其枯燥的.除非有强

CSS基础知识真难啊-background-渐变

background: -moz-linear-gradient(top, blue, white);//-webkit-linear-gradient(top, blue, white)谷歌 线性渐变,-moz-火狐浏览器,top为方向,blue为起点颜色,white为结束颜色 topleft background: -moz-linear-gradient(left top, blue, white);//谷歌改前缀 左上角 background: -moz-linear-gradient(