劍指offer 面試題46 求1 2 n

2021-07-11 09:12:16 字數 1271 閱讀 9856

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

方法一:利用建構函式求解。程式不讓使用迴圈,但是我們可以以另一種方式實現迴圈,譬如利用建構函式,不斷的呼叫建構函式,函式的執行語句放在建構函式內部,當我們建立n個類的例項,建構函式也就執行了n次。

class temp

static void reset()

static unsigned int getsum()

private:

static unsigned int n;

static unsigned int sum;

};unsigned int temp::n = 0;

unsigned int temp::sum = 0;

unsigned int sum_solution1(unsigned int n)

方法二:同樣可以圍繞遞迴做文章。既然不能在乙個函式中判斷是不是應該終止遞迴,那麼我們不妨定義兩個函式,乙個函式充當遞迴函式的角色,另乙個函式處理終止遞迴的情況,我們需要做的就是在兩個函式裡二選一。從二選一很自然的想到布林變數,比如值為true(1)的時候呼叫第乙個函式,值為false(0)的時候呼叫第二個函式。那麼現在的問題是如何把n轉換成布林值。如果對n連續做兩次反運算,即!!n,那麼非零的n轉換為true,0轉換為false。

class a

a* array[2]

class a

};class b: public a

};int sum_solution2(int n)

方法三:c語言的程式設計環境中,不能使用虛函式,此時可以用函式指標來模擬。

typedef unsigned int (*fun)(unsigned int);

unsigned int solution3_teminator(unsigned int n)

unsigned int sum_solution3(unsigned int n)

; return n + f[!!n](n-1);

}

方法四:利用模板型別求解,可以讓編譯器幫助完成類似於遞迴的的計算。(不太懂)

template struct sum_solution4;};

template <> struct sum_solution4<1>

;};

面試題46 求1 2 n

題目 求1 2 n,要求不能使用乘除法 for while if else switch case等關鍵字以及條件判斷語句 a?b c 解法一 利用建構函式求解 建立乙個類,設定兩個靜態變數i和sum,並在建構函式中對i sum i,每次建立乙個類的物件時都會呼叫建構函式,由於成員變數又是靜態的,所...

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...

劍指offer面試題11

面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...