给一整数 n,我们需要求前 n 个自然数形成的集合的所有可能子集中所有元素的和。写一个函数实现此功能。
格式:
输入第一行依次输入一个正整数 n,最后输出对应的 n 的所有子集中所有元素的和。
样例输入
n = 2
n = 3
样例输出
6
24
当k=0,很明显a[0] = 0;
当k=1,a[1] = 1.子集为{1}.a[1] = 2*a[0]+1(1可以看是2的0次方)
当k=2, a[2] = 6.子集为{1},{2},{1,2}.所有集合的元素和为a[2]=1+2+1+2 = 2*a[1]+2*2=2*a[1]+2*(2的1次方)
当k=3,a[3] =24.子集为{1},{2,}{3,},{1,2},{1,3},{2,3},{1,2,3}. 所有集合的元素和为
a[2]=1+2+3+(1+2)+(1+3)+(2+3)+(1+2+3)=(1+2+1+2)+(1+2+1+2)+(3+3+3+3) = 2*a[2]+3*4=2*a[2]+3*(2的2次方)
由此可知,a[k] = 2 * a[k-1]+ k*(2的k-1次方)
实现代码如下:
package suanfa;
import java.math.BigInteger;
public class SubCollectionSum {
public static void main(String[] args) {
int number = 15;
int[] arr = new int[number + 1];
arr[0] = 0;
for (int i = 1; i <= number; i++) {
arr[i] = 2 * arr[i - 1] + i * (int)Math.pow(2, i - 1);
}
for (int i = 0; i <= number; i++) {
System.out.println(i + "的所有子集的和是" + arr[i]);
}
System.out.println(getNumAllSubCollectionSum(15)[15]);
}
public static BigInteger[] getNumAllSubCollectionSum(int number) {
BigInteger[] result = new BigInteger[number + 1];
result[0] = new BigInteger("0");
for (int i = 1; i <= number; i++) {
result[i] = new BigInteger("2").multiply(result[i - 1]).add(new BigInteger(String.valueOf(i)).multiply(new BigInteger("2").pow(i - 1)));
}
return result;
}
}