编程真难啊
上周,在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
又是一个长贴,还带着很多性能分析,真的很好很强大!
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《编程真难啊》的相关评论
变态啊变态。某数学大师研究一辈子 1+1 呢,岂不是更变态?
可见编的不是程序,是寂寞。
呵呵,这么个问题都能引出一大堆人千奇百怪的回复。
@( ⊙ o ⊙ )啊!
弄懂 1+1 的确切含义先
Programming is hard, let’s go shopping!
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
@L
同意!
不懂就不要乱说,你自己好好查查1+1指的是什么?不要想当然。@( ⊙ o ⊙ )啊!
——哈,精辟啊,不过这大抵也是编程的一大乐趣吧
@( ⊙ o ⊙ )啊!
某数学大师只研究出了1+2=2,还没研究出1+1=2呢
@( ⊙ o ⊙ )啊!
民科们总以为哥德巴赫是证明1+1=2的
不过跟他们说素数恐怕他们也听不懂
最怕绕远路了
唉,1+1是哥-筛法的终极命题
1+2离最后的结果,还远得很!
另外,反正我是没听说过1+2=2是个什么命题~
最后:无知跟弱智是两回事,但是很多时候,看起来很像!!
豆豆们都太无聊~~
程序员真寂寞~
编程=!(1^(编程==难?不难:难))
看来,程序员都很幽默。
@( ⊙ o ⊙ )啊!
哥德巴赫猜想不是你yy的1+1…
你懂个屁1+1啊!
复杂程度都比不上
Just another Perl hacker
其实,就是这样,国内的氛围确实不强,如果觉得简单,就可以多搞些好玩的来
蛋疼的程序员们啊……
话说Vijos上有各种A+B Problem的高等解法……(貌似有用微积分的,网络流,位运算一类……)
看来得个答案也挺难的:)
有才
太强大了
好好玩的帖子
在这帖子的回复里,我看到了作者所说的国外的网民和国内网民的差别
看到这样的贴子,就能想到国内论坛上很多这样的“问弱智问题的贴子”,结果可能都会是比较惨!是的,国外的互联网文化和国内差不多,都是恶搞的人多于热心的人,呵呵。不过,国外的网民们有一点是好的,再恶搞也是就事搞事,不会有侮辱人的语言,这点真是值国内的人学习。
=========
我不同意,国内正经对问题回答的人一定不会少,恶搞的也不会少
但骂人的有,却一定不像您估计的”有很多”!
无非就是语重心长的长辈老鸟口吻说”多学点基础”之类的话
(我想程序员里面 随口就骂人的根本很少吧,我是没见过程序员论坛里有地域攻击的事情!)
写个程序不容易啊~
@( ⊙ o ⊙ )啊! 大哥你这个理解。。。还真以为就是你小学一年纪学1+1=2啊?其实这个无知也不是你的错,都是媒体瞎宣传导致的。
@bob
很常见好不好
呵呵 编程从来就不是一件容易的事
豆豆什么的最寂寞了
大师们玩腻了,开始研究1+1了,从C++之父批“把C++称为面向对象语言”和STL之父说“面向对象和人工智能一样,是个骗局”开始
那个for循环是利用signed int的溢出吧?
这不是一个正确的解释。。
@( ⊙ 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”距离“哥德巴赫猜想“仅一步之遥”。呵呵,这是怎么样的“一步之遥”啊!陈景润的同学,著名的中国当代数论专家王元这样论断“这一步大的不得了”,其的距离或许要比之前所走过的所有路程都要远。
以小见大,哈哈
难, 只是对于一般的人来说的!
OMG,我居然想的是乘-1。
笑死啦~~好欢乐~~~~