面試題64:求1+2+…+n。不能用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(包括a?b:c)。
法一:建構函式求解。迴圈讓相同的**迴圈執行n次,我們也可以不用迴圈語句完成,先定義乙個型別,接著建立n個該型別的物件,那麼這個型別的建構函式就會被呼叫n次:
#include
using
namespace std;
class
temp
static
unsigned
getsum()
static
void
reset()
private
:static
unsigned i;
static
unsigned sum;};
unsigned temp::i =0;
unsigned temp::sum =0;
unsigned
getsum
(int n)
temp::
reset()
; temp* p =
new temp[n]
;delete
p;p =
nullptr
;return temp::
getsum()
;}intmain()
法二:虛函式求解。由於我們不能通過if判斷來終止遞迴,我們可以定義兩個函式,乙個充當遞迴函式的角色,乙個處理終止遞迴的情況,我們需要做的就是二選一。可以使用bool變數完成二選一,如值為true時呼叫第乙個函式,否則呼叫第二個。我們可以把數值變數n當做布林值使用,n非0時,通過!!n使條件為true,n為0時,通過!!n使得條件為false:
#include
using
namespace std;
classa;
a* arr[2]
;classa}
;classb:
public a };
intgetsum
(int n)
a a;
b b;
arr[0]
=&a;
arr[1]
=&b;
return arr[
!!n]
->
getsum
(n);
}int
main()
法三:函式指標求解。在純c環境中,不能用虛函式,可以直接使用函式指標:
#include
using
namespace std;
intgetsumteminator
(int n)
intgetsum
(int n)
;// 將兩個函式指標存放在static陣列中
return p[
!!n]
(n -1)
+ n;
}int
main()
法四:利用模板型別求解:
template
<
unsigned
int n>
struct getsum ;}
;template
<
>
struct getsum<
1>;}
;int
main()
在編譯時,getsum會遞迴計算和,n必須是編譯時就能確定的常量,不能動態輸入,且編譯器對遞迴編譯**的深度有限制,不能輸入太大的n。
以上**中使用列舉是因為列舉在類中與static的成員類似,可以不生成物件就訪問,並且列舉也不占用類物件的空間,而是相當於常量,在編譯期就被替換為值了。這種列舉用法可以用在之前比較老的不支援類內const static的編譯器上,因此一種可替代的寫法如下:
template
<
unsigned
int n>
struct getsum
;template
<
>
struct getsum<
1>
;int
main()
劍指筆記 64 求1 2 n
題目 求1 2 3 n,要求不能使用乘除法 for while if else switch case等關鍵字及條件判斷語句 a?b c 思路1 將求和公式進行變形為sum n 2 n 2,然後利用指數和移位操作來計算,如下 1 public class solution 思路2 1.利用短路特性和...
劍指offer刷題 求1 2 n
題目 求1 2 n,要求不能使用乘除法,for while if else switch case等關鍵字及條件判斷語句 a?b c 要求不能使用乘除和一些語句,因此我們可以設計遞迴思路,並且用位運算子來判斷是否到達遞迴終止的條件。另外,我們可以用c 建構函式來設計出一種思路,具體見 class s...
(重要)劍指offer 46 求1 2 N
題目 求1 2.n,要求不能使用乘除法 for while if else switch case等關鍵字及條件判斷語句 a?b c 方法1 利用建構函式,static 構造n個例項。方法2 利用虛函式求解。當n不為0時,呼叫函式base sum 當n為0時,呼叫函式derived sum 方法3 ...