最小的k值(easy version)

题目描述

现在给出一个正整数 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值