📜  2的幂次幂

📅  最后修改于: 2021-04-24 18:18:50             🧑  作者: Mango

给定整数N,任务是找到将其提高到2的幂并最终加起来时得到整数N的数字。

例子 :

Input : 71307
Output : 0, 1, 3, 7, 9, 10, 12, 16
Explanation :
71307 = 2^0 + 2^1 + 2^3 + 2^7 +
        2^9 + 2^10 + 2^12 + 2^16

Input : 1213
Output : 0, 2, 3, 4, 5, 7, 10
Explanation : 
1213 = 2^0 + 2^2 + 2^3 + 2^4 + 
       2^5 + 2^7 + 2^10

方法 :
每个数字都可以用2的幂来描述。
示例:29 = 2 ^ 0 + 2 ^ 2 + 2 ^ 3 + 2 ^ 4。

2 ^ 0(2的指数为’0’)0
2 ^ 2(2的指数是’2’)1
2 ^ 3(2的指数是’3’)3
2 ^ 4(2的指数是’4’)4

通过将给定数字的余数(除以2直到大于0)将其推为矢量,从而将每个数字转换为其二进制等效项。现在,遍历其二进制等效项,只要设置了位,就只需打印第i个值(迭代编号)即可。

应用 :
汉明码:汉明码是一种纠错码,可以检测并纠正一位错误。此模式还用于汉明码错误检测中,其中奇偶校验位基于LSB(最低有效位)存储数字的XOR,其中数字以块分配,您需要找到2的乘幂和的结果块给定号码存在。下图是显示具有给定编号的块的图像。

下面是上述方法的实现:

C++
// CPP program to find the 
// blocks for given number.
#include 
using namespace std;
  
void block(long int x)
{
    vector v;
      
    // Converting the decimal number
    // into its binary equivalent.
    cout << "Blocks for " << x << " : ";
    while (x > 0) 
    {
        v.push_back(x % 2);
        x = x / 2;
    }
  
    // Displaying the output when
    // the bit is '1' in binary
    // equivalent of number.
    for (int i = 0; i < v.size(); i++) 
    {
        if (v[i] == 1) 
        {
            cout << i;
            if (i != v.size() - 1)
                cout << ", ";
        }
    }
    cout << endl;
}
  
// Driver Function
int main()
{
    block(71307);
    block(1213);
    block(29);
    block(100);
    return 0;
}


Java
// Java program to find the 
// blocks for given number.
import java.util.*;
  
class GFG {
  
static void block(long x)
{
    ArrayList v = new ArrayList();
      
    // Convert decimal number to
    // its binary equivalent
    System.out.print("Blocks for "+x+" : ");
    while (x > 0) 
    {
        v.add((int)x % 2);
        x = x / 2;
    }
  
    // Displaying the output when
    // the bit is '1' in binary
    // equivalent of number.
    for (int i = 0; i < v.size(); i++) 
    {
        if (v.get(i) == 1) 
        {
        System.out.print(i);
            if (i != v.size() - 1)
            System.out.print( ", ");
        }
    }
System.out.println();
}
  
// Driver Code
public static void main(String args[])
{
    block(71307);
    block(1213);
    block(29);
    block(100);
}
}
  
// This code is contributed by Arnab Kundu.


Python3
# Python3 program to find the 
# blocks for given number.
def block(x):
      
    v = []
      
    # Converting the decimal number
    # into its binary equivalent.
    print ("Blocks for %d : " %x, end="")
    while (x > 0):
        v.append(int(x % 2))
        x = int(x / 2)
  
    # Displaying the output when
    # the bit is '1' in binary
    # equivalent of number.
    for i in range(0, len(v)):
        if (v[i] == 1):
            print (i, end = "")
            if (i != len(v) - 1):
                print (", ", end = "")
    print ("\n")
  
block(71307)
block(1213)
block(29)
block(100)
  
# This code is contributed by Manish
# Shaw (manishshaw1)


C#
// C# program to find the 
// blocks for given number.
using System;
using System.Collections.Generic;
  
class GFG {
  
    static void block(long x)
    {
        List v = new List();
      
        // Convert decimal number to
        // its binary equivalent
        Console.Write("Blocks for " + x + " : ");
          
        while (x > 0)
        {
            v.Add((int)x % 2);
            x = x / 2;
        }
      
        // Displaying the output when
        // the bit is '1' in binary
        // equivalent of number.
        for (int i = 0; i < v.Count; i++)
        {
            if (v[i] == 1)
            {
                Console.Write(i);
                  
                if (i != v.Count - 1)
                    Console.Write(", ");
            }
        }
      
        Console.WriteLine();
    }
      
    // Driver Code here 
    public static void Main()
    {
        block(71307);
        block(1213);
        block(29);
        block(100);
    }
}
  
// This code is contributed by Ajit.


PHP
 0)
    {
        array_push($v,intval($x % 2));
        $x = intval($x / 2);
    }
  
    // Displaying the output when
    // the bit is '1' in binary
    // equivalent of number.
    for ($i = 0; $i < sizeof($v); $i++)
    {
        if ($v[$i] == 1)
        {
            print $i;
              
            if ($i != sizeof($v) - 1)
                echo ', ';
        }
    }
  
    echo "\n";
}
  
// Driver Code
block(71307);
block(1213);
block(29);
block(100);
  
// This code is contributed 
// by Manish Shaw (manishshaw1)
?>


输出:
Blocks for 71307 : 0, 1, 3, 7, 9, 10, 12, 16
Blocks for 1213 : 0, 2, 3, 4, 5, 7, 10
Blocks for 29 : 0, 2, 3, 4
Blocks for 100 : 2, 5, 6