n(n+1)/2是乙個數列的元素兩兩運算後的不重複結果數。如圖:
假如數列a = 1,2,3....n。那麼該數列內的元素兩兩相乘,則會構建出上圖中的**,這個**應該有n x n 個元素。
用程式寫出來大概就是這樣:
for (int i=0; i)這段程式準確的描述了我們手工填表的過程,填滿整個表一共執行了n*n次操作,產生了乙個n*n的結果集,當然也包含大量重複元素。}
那麼到底有多少重複元素呢? 其實可以通過跟蹤整個運算流程來觀察出其中的規律。
1.當i=1時, a1 * a1, a1*a2.....a1*an 一切正常。
2.當i=2時,a2 * a1, a2*a2.....a2*an 看到第一項了麼,在第一步時已經計算過一次了。
3.當i=3時,a3 * a1,a3*a2, a3* a3....a3*an 第一項在i=1時計算過,第二項在i=2時計算過。
依次類推,可以發現,當i=n的時候,除了an * an 需要計算以外,其他項全都已經計算過了。
現在讓我們來一次時光倒流:從i=n的時候開始,他只有最後一次計算是不重複的(an*an),其餘n-1次運算都是"徒勞",所以它產生了n-1個重複元素。
然後是i=n-1的時候,他只有最後兩次運算是不重複的(an-1 * an-1, an-1 * an),餘下的n-2個計算結果都是重複的。
一直進行到當i=2的時候,也就是上面描述的第二步,當第乙個重複數出現的時候。
然後就可以把他們都加起來,他們的和就是所有重複數了:r = 1+2+...+n-1
11 + 2 + ... + n-1 =r
2 n-1 + n-2 + ... + 1 =r
將1式和2式相加=> 2r = n(n-1) => r = n(n-1)/2
得到了重複數r,那麼剩下多少不重複的呢? n*n - r = n(n+1)/2 wala~ qed
----note---
這其實是乙個可重複的n choose m 組合問題,而這裡的m是2,有時間的話想好好證明一下這個問題
n為整數,如何判斷n n 1 2的奇偶性
在判斷n n 1 2時我們先來假定乙個任意整數k,那麼此時,2k一定是偶數,2k 1一定是奇數 接下來開始判斷n n 1 2的奇偶性,我們先來對分子的奇偶性進行分情況討論 一.當分子的n為偶數,n 1為奇數時 因為此時 n 1 為奇數,n 1 2不為整數,n 2卻有兩種情況,例如n 8時,n 2為偶...
為什麼用補碼,為什麼有符號單位元組最小是 128
1.為什麼用補碼 先說明同餘的概念 同餘運算及其基本性質 關於同餘負數問題,可以用負數,但是得想清楚為啥 怎樣直白地理解補碼原理?參考上面文章基本能明白了為什麼用補碼,為了用加法器能計算負數 總結上面的結論 那為什麼正負數要隔開呢?為了製造出類似原碼的符號位,這樣補碼轉換原碼的時候,就可以區分轉換了...
為什麼是 pgsql ?
postgresql在國外很流行 在日本是僅次於apache的開源軟體 pgsql 使用程序 postgresql資料庫是多程序的架構.每乙個客戶連線都有乙個服務程序為其進行服務,也有共享記憶體,這一點是與orancle資料庫是相似的.postgresql使用一種客戶端 伺服器的模式.乙個伺服器程序...