给出一个整数 x ,要找一个整数 y ,满足 y<x ,且 yy的二进制表示中 11 的个数比 x 的二进制表示中 1 的个数少 1 ,满足要求的 yy 可能有多个,输出最大的那个。
从 x 倒序循环,用循环的数每次除2取得余,统计1 的个数
你题目的解答代码如下:
#include <iostream>
using namespace std;
int f(int y)
{
int count = 0;
while (y > 0)
{
if (y % 2 == 1)
count++;
y /= 2;
}
return count;
}
int main()
{
int x, n, y;
cin >> x;
n = f(x);
for (y = x - 1; y >= 0; y--)
{
if (n - f(y) == 1)
{
cout << y << endl;
break;
}
}
return 0;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
代码如下:
#include <iostream>
using namespace std;
//整数转二进制
void trans(int n,int buf[],int &nlen)
{
int i = 0,j;
int t;
while(n)
{
buf[i] = n%2;
n/=2;
i++;
}
nlen = i;
//逆序
for(i=0,j=nlen -1;i<j;i++,j--)
{
t = buf[i];
buf[i] = buf[j];
buf[j] = t;
}
}
//查找数组中11的个数
int nmbs11(int buf[],int nlen)
{
int i = 0;
int count = 0;
for(i=0;i<nlen-1;i++)
{
if(buf[i]==1 && buf[i+1]==1)
{
count++;
i++;
}
}
return count;
}
//查找数组中1的个数
int nmbs1(int buf[],int nlen)
{
int count = 0,i;
for(i=0;i<nlen;i++)
{
if(buf[i]==1)
count++;
}
return count;
}
int main()
{
int x,y;
int a[100],nlen=0,nmboo=0,nmbo=0;
int maxy=0;
cin >> x; //输入x
trans(x,a,nlen);
nmbo = nmbs1(a,nlen); //得到x中1的个数
for(y=x-1;;y--)
{
trans(y,a,nlen); //y转成二进制
nmboo = nmbs11(a,nlen); //二进制中11的个数
if(nmboo +1 == nmbo)
{
maxy = y;
break;
}
}
cout << maxy;
return 0;
}
想要代码。。。。。谢谢!!
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!