消减整数
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给出一个正整数H,从1开始减,第一次必须减1,每次减的数字都必须和上一次相同或者是上一次的两倍,请问最少需要几次能把H恰好减到0。
输入描述:
第一行给出一个正整数TT,1≤T≤1041≤T≤104
接下来T行每行一个H,1≤H≤109H,1≤H≤109
输出描述:
每行一个正整数代表最少的次数
示例1
输入
3 3 5 7
输出
2 3 3
为了使操作次数小,我们可以一种二倍减数,然后直到不能的情况下,从当前的数开始/2每次都要尽多的用到减数 所以我们用while
int t;
ll a[110];
void init(){
a[0]=1;
for(int i=1;i<40;i++){
a[i]=a[i-1]<<1ll;
}
}
int main(){
cin>>t;
init();
while (t--) {
ll x;
cin>>x;
int ans=0;
int i;
for( i=0;i<40;i++){
if (x-a[i]>=0) {
x-=a[i];
ans++;
}
else break;
}
for(;i>=0;i--){
while (x-a[i]>=0) {
x-=a[i];
ans++;
}
}
cout<<ans<<endl;
}
}