【问题标题】:Find minimum element for the calculated decimal into the power of 2找到计算的小数到 2 的幂的最小元素
【发布时间】:2018-01-11 12:05:28
【问题描述】:

有一个给定的数组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 所以在 a[] ={0,7} 中,两个元素

是可能的解决方案。因为我希望最小的不是 2 的幂。

可能有类似的解决方案

2^6+2^1+2^0= 129 所以在 a[] ={0,1,6} 中,三个元素

但我希望尽可能少**

我将数组中的每个元素都取为 2 的幂,然后计算小数点。但无法找到最小元素来计算相同的小数到 2 的幂。

【问题讨论】:

  • 你能更好地描述这个算法的输入和输出吗?我想我已经弄清楚了,但如果没有更好的详细解释,我不确定。
  • 129 就是答案。我想要数组中元素最少的相同值
  • @Dukeling:我想要计算十进制的二进制表示,如下所示 2^7+2^0 => 128+1 => 129 是可能的解决方案,因为我想要最小的权力2. 可能有像 2^6+2^1+2^0= 129 这样的解决方案,但我希望尽可能少。

标签: arrays algorithm math binary decimal


【解决方案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

【讨论】:

  • 我不认为这是他想要的——他想要一个固定数量的权力,它给出最小的总和;例如2 x 0
  • 总和可能会溢出,因此您可能无法直接找到 129
  • @marvel308 未指定语言,因此此方法适用于具有任意整数精度的语言,例如 Python 或 Ruby。
  • @Dukeling 我的意思是最小化指数本身的总和
  • @Dukeling 是的,他的措辞并不准确,语法错误也无济于事
【解决方案2】:

如果您无法求和以防溢出,您可以使用优先级队列来解决它
现在基本上取优先级队列中当前存在的 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;
}

【讨论】:

    【解决方案3】:

    可以将问题简化为所有不同的指数。事实上,如果 2 的两个幂具有相同的指数 k,那么 2^k + 2^k = 2.2^k = 2^(k+1) 等等......

    然后根据整数的base-2表示的唯一性,我们可以证明base-2表示给出的元素最少(所有不同的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 2012-03-16
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2011-10-08
      • 2012-10-22
      相关资源
      最近更新 更多