http://acm.hdu.edu.cn/showproblem.php?pid=5491
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<algorithm> const int N = 110; typedef long long ll; using namespace std; int d[N]; int get(ll n) { int j = 0, num = 0; while(n) { d[j++] = n % 2; if(n % 2 == 1) num++; n /= 2; } return num; }//求n的二进制中1的个数 ll Pow(int a, int b) { ll ans = 1; while(b) { if(b % 2 == 1) ans *= a; a *= a; b /= 2; } return ans; }//快数幂求a的b次幂 int main() { int t, num, a, b, x = 0; ll n; scanf("%d", &t); while(t--) { x++; scanf("%I64d%d%d", &n, &a, &b); memset(d, 0, sizeof(d)); n++; num = get(n); printf("Case #%d: ", x); while(1) { if(num >= a && num <= b) { printf("%I64d\n", n); break; } else if(num < a) { int k = 0; while(d[k]) k++; d[k] = 1; n += Pow(2, k); num++; } else if(num > b) { int k = 0; while(!d[k]) k++; n += Pow(2, k); num = get(n); } } } return 0; }
原文:http://www.cnblogs.com/qq2424260747/p/4849839.html