算法作業:求一個集合中所有子集元素之和


問題描述:

求一個集合中所有子集元素之和。如{1,2,3,4,5,6,7,8,9,10……n}

算法分析:

由於集合中元素具有無序性, 所以集合中每個元素在子集中出現的次數是相同的。這樣的話,問題就簡單了,求所有子集元素的和就可以簡化為求每個元素在子集中出現的次數*全集中所有元素的和。全集中所有元素的和好求,就是n*(n+1)/2。

集合中任何一個元素出現的次數,比如1,我們可以這樣來求:

首先一個集合的子集個數是2n,這個都學過,我就不推導了。

我們想求 1 出現 的次數,不好求,我們可以轉化為求 1 不出現的次數,1 不出現的次數就是原來集合中除了元素 1 的元素的集合的子集個數。不明白??舉個例子

{1,2,3,4}這個集合子集的個數是24,除去 1 之后集合就變為 {2,3,4}這個集合的子集個數是23,也就是說只有這些集合中沒有 1 ,我們想求的 1 出現的個數就是24-23

所以在含n個元素的集合中,任何一個元素在子集中出現的次數就是2n-2n-1=2n-1

所以集合中所有元素之和sum=(n*(n+1)/2)*(2n-1)

代碼實現:

#include<stdio.h>
#include<math.h>
int main()
{
     int n,sum;
    printf( " 輸入數字 N :  "); 
    scanf( " %d ",&n);
    sum=pow( 2,n- 1)*(n*(n+ 1)/ 2);
    printf( " 和為%d\n ",sum);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM