劍指offer 學習筆記 求1 2 n

2021-10-05 06:39:13 字數 2185 閱讀 8376

面試題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 ...