zoukankan      html  css  js  c++  java
  • 算法作业:求一个集合中所有子集元素之和

    问题描述:

    求一个集合中所有子集元素之和。如{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);

  • 相关阅读:
    VS自带的诊断工具
    Electron学习
    PC跨*台
    .NET调试学习
    Mac使用
    SSL/TLS
    UKey学习
    授权机制OAuth、JWT
    代理服务器
    .NET相关源码查找
  • 原文地址:https://www.cnblogs.com/ma6174/p/2378095.html
Copyright © 2011-2022 走看看