谁做网站收录,网站设计与制作费用,普通个人简历,wordpress 手机页面停Description 给定一个范围[a,b] (0ab10^18) 求出该范围内二进制中1的个数最多的数#xff0c;如果存在多个答案#xff0c;输出最小的那个数 Input 输入数据有多组#xff0c;每组数据输入两个整数a#xff0c;b#xff0c;表示区间[a, b]。 Output 输出该区…Description 给定一个范围[a,b] (0ab10^18) 求出该范围内二进制中1的个数最多的数如果存在多个答案输出最小的那个数 Input 输入数据有多组每组数据输入两个整数ab表示区间[a, b]。 Output 输出该区间内二进制的1最多的整数如果有多个数二进制1的个数相同输出最小的那个数。 Sample Input 4 8
7 14Sample Output 7
7 思路 区间[a,b]如果ab输出a 先把a,b化为二进制数每位分别保存到数组中如果a的二进制位数小于b的位数那么直接输出 2^(b的位数-1 -1(此处如果b等于 2^b的位数 -1 就直接输出b) 也就是二进制数比b少一位且所有位均为1如果a的位数等于b的位数要求最小的符合题意的数尝试着从a的二进制低位开始如果是0将其变为1看是否小于等于b如果是继续操作如果不是退出。 要注意10^18 2^62 所以要存这么大是数组才行 2^63超过longlong范围 #includeiostream
#includecstdio
using namespace std;
#define ll long long
ll n,m;
int nn[65],mm[65];
ll p[65];
void inti()
{p[0]1;for(int i1;i63;i)p[i]p[i-1]1;
}
int getbit(ll x,int a[])
{int s0;while(x){a[s]x%2;x/2;}return s;
}
int main()
{inti();while(~scanf(%lld%lld,n,m)){int lenngetbit(n,nn);int lenmgetbit(m,mm);if(lennlenm){// input 3 7 output 7if(mp[lenm]-1)printf(%lld\n,m);else printf(%lld\n,p[lenm-1]-1);continue;}// printf(lenn%d\n,lenn);for(int i0;ilenn;i){if(nn[i]0){//printf(** %lld %d\n,n,i);if(np[i]m)np[i];else break;}}printf(%lld\n,n);}return 0;
} 转载于:https://www.cnblogs.com/kylehz/p/4324812.html