不用乘除,迴圈,判斷求前n項和 三種方法

2021-06-07 09:03:21 字數 1245 閱讀 6294

題目:求

1+2+ … +n

,要求不能使用乘除法、

for

、while

、if

、else

、switch

、case

等關鍵字以及條件判斷語句

(a?b:c )。

方法1:針對迴圈可以用遞迴來替代,而針對遞迴的結束可以用

n&&(fun())

來代替,因為一旦n等於

0則不會執行後面的**了。

整個**:

intaddtion

(intn)

方法二:利用數學知識

其實當在處理陣列之類問題,利用數學知識去考慮,也是一種思路。

#define t(x, y, i) (y &(1<

t(r, n, 0); t(r, n,1); t(r, n, 2); …t(r, n, 31);

return r >> 1;}

//這個方法思路是將

n看做是

2位進製數,然後從低位到高位迴圈,如果當前位為1且

(假設當前位是第i位

)則將n的左移

i位的值進行累加。也就是利用了位操作和位操作來實現求乙個數的平方。

例如:求100的平方:

100對應的二進位制為:01100100

那麼從右邊開始向左移位(位置從0開始計數),分別發現第2,5,6位是1那麼就將100左移2,5,6之後的數累加起來,實際上是100分別乘以:2^2=4,2^5=32,2^6=64,的結果進行累加,而這個累加實質就是100*(4+32+64)=100*100也就是100的平方。但它的確沒有用到乘法,實在是妙不可言呀。

而我們要的結果是n^2+n,那麼可以在累加前將儲存累加中間結果的變數初始化為n(比如在上面**中r初始為n),這樣再進行累加就可以得到n^2+n了。

方法三是在網上看到的,定義乙個類,我們new一含有n個這種型別元素的陣列,那麼該類的建構函式將確定會被呼叫n次。將需要執行的**放到建構函式裡。如下**正是基於這個思路:

class temp

staticvoidreset()

staticintgetsum()

private:

staticint n;

staticintsum;

};int temp::n = 0;

int temp::sum = 0;

int solution1_sum(int n)

但個人覺得從演算法角度講第一,二種方法更好些。呵呵 

求前N項和

再做以前的題目,發現解法其實好多種,雖然萬變不離其宗,可是收穫還是好多。時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 張彤彧 浙江大學 本題要求編寫程式,計算序列 2 1 3 2 5 3 8 5 的前n項之和。注意該序列從第2項起,每...

c語言中求前N項和

功能 計算機對輸入的乙個資料n進行前n項計算,然後計算機進行詢問是繼續輸入資料進行一次計算還是停止計算。程式 include int sum int a int again sum char w int main int sum int a return b printf 前n項和為 d n b i...

C 用遞迴求前n項階乘的和

求前n項階乘的和。includeusing namespace std 求某項階乘的值 5 1 2 3 4 5 int fun int i 求前n項階乘的和 s x f 1 f 2 f x int fun2 int i 求前n項階乘的和 s x f 1 f 2 f x int fun2 int i ...