《劍指Offer》面試題:1+2+3+...+n
阿新 • • 發佈:2019-02-07
題目描述:
求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);
}
}
}