1. 程式人生 > >《劍指Offer》面試題:1+2+3+...+n

《劍指Offer》面試題:1+2+3+...+n

題目描述:
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。

思路:
每個人對這個題目都比較熟悉,也都會求解。每個人能夠想到的方法有
1)遞迴
2)迴圈累加求和。
3)直接用等差數列求和公式
但是,由於題目限制了,不能 使用乘除法、迴圈等要求,因此不能直接使用上面的方法。
雖然這個題目看起來很簡單,但是當加入了這麼的限制條件之後,這個題目的解題思路就需要想點辦法了。

思路一:遞迴實現,不能是有if、else

#include <stdio.h>
int sum1ToN(int
n){ int result=0; n&&(result=n+sum1ToN(n-1));//這裡就避免了使用if來判斷 return result; } int main(){ printf("%d\n",sum1ToN(100)); return 0; }

思路二:利用函式呼叫自己本身並利用全域性變數來完成累加求和

/*

輸入:
輸入可能包含多個測試樣例。
對於每個測試案例,輸入為一個整數n(1<= n<=100000)。
輸出:
對應每個測試案例,
輸出1+2+3+…+n的值。
樣例輸入:
3
5
樣例輸出:
6
15
*/
/

#include<stdio.h>
#include<stdlib.h> int n=0; int result=0; int funReturnResult(int ); int sum1ToN(int ); int (*fun[2])(int)={funReturnResult,sum1ToN}; int funReturnResult(int n){ return result; } int sum1ToN(int n){ result+=n; n--; fun[int(n!=0)](n);//即當i=0時返回0,呼叫函式結束,否則則呼叫自己本身 } int main(void){ while
(scanf("%d",&n)!=EOF&&n>0){ result=0; int res=sum1ToN(n); if(res>0){ printf("%d\n",res); } } }