题目描述
现在给出一个正整数 n ,找到最小值 k 使得 n 可以表示为k个不同的强大的数字的和,或者说没有这样的数字 k.
强大的数字:2的幂。即2^d
例:1,4,8 都是强大的数字,因为1=2^0,4=2^2 和 8=2^3
输入
每个测试包括多个测试样例,每一行包括测试用例的数量 T (1≤T≤100)
一个测试用例只包括一行,包括一个正整数 n (1≤n≤1e12)
输出
对于每个测试用例,将最小值 k 输出。
如果不存在k个强大的数字的和为n,那么输出-1.
样例输入
4 7 11 240 17179869184
样例输出
3 3 4 1
知识:任意正整数都可以写成2的不同幂次之和
任何数都能分解成2的幂,比如
7=1+1+1+1+1+1+1
=1+1+1+1+1+2
=1+1+1+2+2
=1+2+2+2
=1+1+1+4
=1+2+4
关键:把每一个数都当成二进制的数进行处理 例如:
7的二进制为:111,即2^2+2^1+2^0
11的二进制为:1011,即2^3+2^1+2^0
240的二进制为:11110000,即2^7+2^6+2^5+2^4
可以发现十进制数n转换为二进制后有k个1,n就可以 表示为k个不同的强大的数字的和
其实这道题每个正整数都有唯一k的值且不会有输出-1的情况
参考代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll t,n;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
int res=0;
for(int i=0;i<=50;i++)
{
if(n>>i&1)
res++;
}
cout<<res<<endl;
}
return 0;
}