C-消减整数
消减整数
https://ac.nowcoder.com/acm/contest/11163/C
C-消减整数
解题思路: 从1开始减(设i为1),后面只能减 i 或者2* i,也就是说只能减2的倍数,那么如果一开始n为双数就得减两次i=1(题目要求第一次必须减1,为了确保n能到0所以需要保证n是双数),否则减一次。确保n为双数以后开始循环,如果能被i的两倍整除,那么就i* 2,否则就减自身i不变。用num作为计数器就好了。
#include<iostream> #include<math.h> typedef long long ll; using namespace std; int main() { ll t,n,i,num; cin>>t; while(t--) { num=0,i=1; cin>>n; if(n%2==0)//如果开局是双数 { num+=2; n-=2;//保证n是双数 } else//如果是单数 { num+=1; n-=1;//保证n是双数 } while(n)//开始循环n { if(n%(i*2)==0)//如果能被i*2整除 { i*=2; n-=i; num++; } else//否则 { n-=i; num++; } } cout<<num<<endl; } return 0; }