Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算给定列表的n个功率集_Java_Biginteger - Fatal编程技术网

Java 计算给定列表的n个功率集

Java 计算给定列表的n个功率集,java,biginteger,Java,Biginteger,我正在编写一个函数,用于确定列表的“n”幂集的数量。 在处理问题并解决它之后,我发现了集的长度和功率集的数量之间的关系 2^i 其中i是列表的长度 此公式适用于: Powers.powers(new int[]{}); // 1 Powers.powers(new int[]{1}); // 2 Powers.powers(new int[]{1,2}); // 4 Powers.powers(new int[]{1,2,3,4}); // 16 利用这些信息

我正在编写一个函数,用于确定列表的“n”幂集的数量。 在处理问题并解决它之后,我发现了集的长度和功率集的数量之间的关系

2^i

其中i是列表的长度

此公式适用于:

Powers.powers(new int[]{});        // 1
Powers.powers(new int[]{1});       // 2
Powers.powers(new int[]{1,2});     // 4
Powers.powers(new int[]{1,2,3,4}); // 16
利用这些信息,我写出了以下代码:

if(list.length == 1) return BigInteger.valueOf(2);
if(list.length == 0) return BigInteger.valueOf(1);
return BigInteger.valueOf((long)Math.pow(2, list.length));
这在最初的几次测试中效果很好,直到它在数组长度为100时打嗝为止。幸运的是,它确实计算了正确的值,即1.2676506e+30,但Arraysize 100的预期功率集数为:9223372036854775807

编辑:
将公式调整为2^i,为了澄清我理解计算是如何工作的,我只是不理解测试用例期望9223372036854775807的方式或原因。它传递长度为100的数组,除索引99的值为100外,所有值均为0。

您的意思是
2^n
,而不是
4^(n/2)
。其实是一样的

使用
BigInteger
可以非常轻松地计算,不会有溢出风险:

静态BigInteger功率集(int n){
返回BigInteger.ONE.shiftLeft(n);
}
试验

System.out.println(功率集(0));
系统输出打印LN(功率集(1));
系统输出打印LN(功率集(2));
系统输出打印LN(功率集(4));
系统输出打印LN(功率集(100));
系统输出打印LN(功率集(1000));
输出

1
2.
4.
16
1267650600228229401496703205376
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

更新:如果可能存在重复值,则会变得稍微复杂一些:

静态大整数幂(int…值){
返回Arrays.stream(values).boxed()
.collect(Collectors.groupingBy(Function.identity()、Collectors.counting())
.values().stream()
.map(freq->biginger.valueOf(freq+1))
.reduce(biginger.ONE,biginger::multiply);
}
试验

System.out.println(powers());
系统输出println(powers(1));
系统输出println(幂(1,2));
系统输出println(幂(1,2,3,4));
系统输出打印LN(幂(0,1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15,16,17,18,19,
20,21,22,23,24,25,26,27,28,29,
30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,
50,51,52,53,54,55,56,57,58,59,
60,61,62,63,64,65,66,67,68,69,
70,71,72,73,74,75,76,77,78,79,
80,81,82,83,84,85,86,87,88,89,
90,91,92,93,94,95,96,97,98,99));
System.out.println(幂(1,3,3,3,7));
输出

1
2.
4.
16
1267650600228229401496703205376
20

你的意思是
| P(S)|=2^n
(与
4^(n/2)
相同,但更干净)。这是
1,因为所有其他结果都是偶数,为什么您希望100的结果是奇数Long.MAX_值,即9223372036854775807?预期:但是是:我的测试用例预期的。我没有编写测试用例。您显示的代码返回9223372036854775807,因为如果转换为
Long
,则值1.2676506e+30将变为
Long。MAX_值将变为
Long
,因为否则会发生数字溢出。--您说它实际上返回了1267650600228229401496703205376,但鉴于所示的代码,我无法重现该结果。顺便说一句,如果您需要使用第一原理(例如,在一种不具备任意精度算术的语言中)执行此操作,请参阅。