给定一个数字,我们必须找到下一个最高数字和前一个数字,它们的二进制表示中具有相同数量的1位
我的解决方案是一种蛮力方法,即增加数量和计算数量 如果它具有相同数量的1,那么打印它
以前的数字与上述相同的方法
是否有任何优化的解决方案,而不是检查所有数字?
答案 0 :(得分:6)
要获得次高的数字,只需搜索01
的第一个实例,从右侧开始,将其更改为10
。然后将交换位右侧的所有1
折叠到最不重要的位置。
示例:
||
00110000 // 0x30 in hex
交换后:
||
01010000 // 0x50 in hex
接下来,将交换位右侧的所有1折叠到最不重要的位置:
||---->
01000001 // 0x41 in hex
要获取上一个号码,请从右侧开始搜索10
的第一个实例,并将其替换为01
。然后将交换后的所有0
折叠到最不重要的位置(或者,将交换的位后的所有1
折叠到最重要的位置)。
示例:
||
01001001 // 0x48 in hex
交换后:
||
01000101 // 0x45 in hex
接下来,将交换位右侧的所有0折叠到最不重要的位置:
||->
01000110 // 0x46 in hex
这是一个简短的程序,它将显示下一个更高和更低的数字。
#include <iostream>
#include <bitset>
#include <stdlib.h>
using namespace std;
#define NUMSIZE 8 // The number of bits to display
// Finds the first and second values, swaps them, and collapses.
void swap_and_collapse(bitset<NUMSIZE>& num, bool v1, bool v2, bool c) {
// Find the v1 immediately followed by v2 in the number.
int insert_pos = 0;
for (int i=1; i<NUMSIZE; i++) {
if ((num.test(i-1) == v2) && (num.test(i) == v1)) {
// Found them. Swap the values.
num.flip(i-1); num.flip(i);
break;
} else {
// Move any c bits to the beginning.
if (num.test(i-1) == c) {
num.flip(i-1);
num.flip(insert_pos++);
} // if (num.test(i-1) == c)
} // if ((num.test(i-1) == v2) && (num.test(i) == v1))
} // for (int i=0; i<16; i++)
} // swap_and_collapse
int main(int argc, char* argv[]) {
// Get the number from the command line and display in binary.
int value = atoi(argv[1]);
bitset<NUMSIZE> orig (value);
cout << "Original Number " << orig.to_ulong() << " is " << orig << endl;
// Find the next higher number.
bitset<NUMSIZE> higher(value);
swap_and_collapse(higher, 0, 1, 1);
// Find the next lower number.
bitset<NUMSIZE> lower (value);
swap_and_collapse(lower, 1, 0, 0);
cout << "Higher number " << higher.to_ulong() << " is " << higher << endl;
cout << "Lower number " << lower.to_ulong() << " is " << lower << endl;
} // main
答案 1 :(得分:0)
这是用于查找具有相同数量的下一个最高数字的代码
#include<iostream>
using namespace std;
int main()
{
int c;
cin>>c;
int n=c;
int c1=0;
while(((c&1)==0) && (c!=0) )
{
c1++;
c=c>>1;
}
cout<<"the no of zereos"<<c1<<endl;
cout<<c<<endl;
int c2=0;
while((c&1)==1)
{
c2++;
c=c>>1;
}
cout<<"no of ones"<<c2<<endl;
cout<<c;
int p=c1+c2;
n=n|(1<<p);
int a=1<<p;
int b=a-1;
cout<<endl<<b;
int mask=~b;
n=n&mask;
a=1<<(c2-1);
b=a-1;
n=n|b;
cout<<"\n"<<a;
cout<<"\n"<<n;
}