程式設計演算法練習 1 12

2021-07-25 23:23:11 字數 2173 閱讀 8290

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

分析:這道題沒有多少實際意義,因為在軟體開發中不會有這麼**的限制。但這道題卻能有效地考查發散思維能力,而發散思維能力能反映出對程式設計相關技術理解的深刻程度。

通常求1+2+…+n 除了用公式n(n+1)/2之外,無外乎迴圈和遞迴兩種思路。由於已經明確限制for和while的使用,迴圈已經不能再用了。同樣,遞迴函式也需要用if語句或者條件判斷語句來判斷是繼續遞迴下去還是終止遞迴,但現在題目已經不允許使用這兩種語句了。

我們仍然圍繞迴圈做文章。迴圈只是讓相同的**執行n遍而已,我們完全可以不用for和while達到這個效果。比如定義乙個類,我們new一含有n個這種型別元素的陣列,那麼該類的建構函式將確定會被呼叫n次。我們可以將需要執行的**放到建構函式裡。如下**正是基於這個思路:

[cpp]view plain

copy

class

temp  

static

void

reset()   

static

intgetsum()   

};  

inttemp::n = 0;    

//靜態成員的值對所有的物件是一樣的。靜態成員可以被初始化,但只能在類體外進行初始化。

inttemp::sum = 0;  

intsolution1_sum(

intn)    

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

[cpp]view plain

copy

class

a;  

a* array[2];  

class

a    

};  

class

b: public

a    

};  

intsolution2_sum(

intn)    

這種方法是用虛函式來實現函式的選擇。當n不為零時,執行函式b::sum;當n為0時,執行a::sum。我們也可以直接用函式指標陣列,這樣可能還更直接一些:

[cpp]view plain

copy

typedef

int(*fun)(

int);  

intsolution3_f1(

inti)   

intsolution3_f2(

inti)  

;   

return

i+f[!!i](i-1);  

}  

另外我們還可以讓編譯器幫我們來完成類似於遞迴的運算,比如如下**:

[cpp]view plain

copy

template

<

intn> 

struct

solution4_sum  

;  };  

template

<> 

struct

solution4_sum<1>  

;  };  

solution4_sum<100>::n就是1+2+...+100的結果。當編譯器看到solution4_sum<100>時,就是為模板類

solution4_sum以引數100生成該型別的**。但以100為引數的型別需要得到以99為引數的型別,因為solution4_sum<100>::n=solution4_sum<99>::n+100。這個過程會遞迴一直到引數為1的型別,由於該型別已經顯式定義,編譯器無需生成,遞迴編譯到此結束。由於這個過程是在編譯過程中完成的,因此要求輸入n必須是在編譯期間就能確定,不能動態輸入。這是該方法最大的缺點。而且編譯器對遞迴編譯**的遞迴深度是有限制的,也就是要求n不能太大。

C C C程式語言 練習1 12

練習1 12 編寫乙個程式,以每行乙個單詞的形式列印其輸入。先附上乙個程式,這個程式統計輸入的行數 單詞數以及字元數。include include 統計輸入的行數 單詞數 字元數 這裡的單詞是任何其中不包含空格 製表符或換行符的字串行 int main void 如何統計單詞數?如果c是空格 或者...

11 2程式設計總結

1.如何讓多個div排列在一行當中input type text value style width 25 type text class form control placeholder sku style width 25 float left maxlength 50 box1 box2 st...

程式設計演算法練習

題目1 乙個台階總共有n級,如果一次可以跳1級,也可以跳2級。求總共有多少總跳法,並分析演算法的時間複雜度。分析 這道題最近經常出現,包括microstrategy等比較重視演算法的公司都曾先後選用過個這道題作為面試題或者筆試題。首先我們考慮最簡單的情況。如果只有1級台階,那顯然只有一種跳法。如果有...