看到網路上一篇blog一個問題,引發一群網友的討論。
Q:寫一個函數計算當參數為 n(n很大) 時的值 1-2+3-4+5-6+7……+n
這是個常見的級數問題,我們必須化簡成closed form 來得到最佳的效率。
一般解法: 主要使用 迴圈
long fn(long n) { long temp=0; int i,flag=1; if(n<=0) { printf("error: n must > 0); exit(1); } for(i=1;i<=n;i++) { temp=temp+flag*i; flag=(-1)*flag; } return temp; }
用數學化簡:
long fn(long n) {
if(n<=0) {
printf("error: n must > 0);
exit(1);
}
if(0==n%2)
return (n/2)*(-1);
else
return (n/2)*(-1)+n;
n%2 也可以用 n&1來取代。n/2 用 n>>1
long fn(unsigned long n){
return (long)n/2*(-1)+((n%2)?n:0);
}
更牛逼的還用assembly language
long fn(long n) { __asm{ mov eax,n ; Load n to AX inc eax ; AX = AX + 1. shr eax,1 ; AX divides by 2. jnc EXIT ; Exit if AX is a odd number. neg eax ; AX = -AX ; EXIT: } }