给定整数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