有一个给定的数组 Int a = {3,2,0,0,1,4,5,6,0}
现在数字的每个元素在2的幂中如下
2 ^ 3 + 2 ^ 2 + 2 ^ 0 + 2 ^ 0 + 2 ^ 1 + 2 ^ 4 + 2 ^ 5 + 2 ^ 6 + 2 ^ 0 = 129
找到2的幂的最小元素,以便得到相同的十进制值。
129 = 需要知道算法/函数以找到2的幂的最小元素,以便我们得到相同的十进制值,该值是从给定数组计算为2 的幂。
请让我知道我尝试过的功能,但无法弄清楚如下
**编辑**
我希望数组中的最小元素为2的幂。它给出了相同的值.whihc是根据给定的输入数组计算的。
**我想要计算小数的二进制表示如下
2 ^ 7 + 2 ^ 0 => 128 + 1 => 129所以在[] = {0,7},两个元素
是可能的解决方案。因为我希望最小的没有进入2的力量。
可能有像
这样的解决方案2 ^ 6 + 2 ^ 1 + 2 ^ 0 = 129所以在[] = {0,1,6}中,有三个元素
但我希望尽可能减少**
我将数组的每个元素取为2的幂并计算小数。但是无法找到计算相同小数的最小元素为2的幂。
答案 0 :(得分:1)
只需用二进制表示结果,在二进制表示中获取1的位置
129dec = 10000001bin
因此结果是设置位{0,7}
请注意,您不需要二进制表示 - 只需从数字
中提取位位置 IntResult = Sum Of Given Powers //here we get value like 129
SetBitList = {} //list/array for bit positions
i = 0
while (IntResult) do
if (IntResult && 1) //if least-significant bit is non-zero
SetBitList.Add(i)
IntResult = IntResult >> 1 //shift right
i = i + 1 //increment position
答案 1 :(得分:0)
如果无法对溢出进行求和,可以使用优先级队列来解决它 现在基本上取现在优先级队列中存在的2个最小数字(0和0),因为2 ^ 0 + 2 ^ 0 = 2 ^ 1我们合并这个并将它添加到优先级队列,因为数字不相等我们添加回答较小的位并将较大的数字添加回优先级队列,我们这样做直到我们在优先级队列中剩下1个数字为止 请注意,我的优先级队列是最小堆
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
class priortise{
public:
bool operator()(const int &x, const int &y){
return x>y;
}
};
int main() {
// your code goes here
int a[] = {3,2,0,0,1,4,5,6,0},ans = 0;
//priority_queue<int, vector<int>, priortise> pq;
priority_queue<int> pq;
for(int i=0;i<9;i++){
pq.push(a[i]);
}
while(!pq.empty()){
int u = pq.top();
pq.pop();
if(pq.empty()){
ans++;
break;
}
int v = pq.top();
pq.pop();
if(u==v){
pq.push(u+1);
}
else{
ans++;
pq.push(v);
}
}
printf("%d\n", ans);
return 0;
}
答案 2 :(得分:0)
可以将问题减少到指数所有区别。事实上,如果两个2的幂具有相同的指数k
,那么2^k + 2^k = 2.2^k = 2^(k+1)
等等......
然后根据整数的base-2表示的唯一性,我们可以证明base-2表示给出最小元素(所有区别)。