題目:求
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 ...