我对以下问题感到困惑。 翻转位表示将位从0更改为1,反之亦然。操作OP(i)将导致二进制数字的翻转,如下所示。 执行OP(i)将导致从开始i> 0
开始每个第i位的翻转给出n位数作为输入,并且一个接一个地施加OP(j)和OP(k)。目标是指定应用这两个操作后保持相同的位数。
当我应用逻辑层(n / i)+ floor(n / j)-2时,它没有给我预期的解决方案。 例: 二进制数:10110101101 I:3 记者:4 预期产量:6 但是我得到了3.请告诉我如何解决这个问题。 我也检查了这个解决方案Filpping bits in binary number。但他们也提到了相同的逻辑。
答案 0 :(得分:2)
让寄存器包含N位,位1到N.
(1)OP(i)表示每个第i位都被翻转。那是i,2 * i,3 * i ...的位
被翻转。翻转的总位数= floor(N / i)
(2)OP(j)表示每个第i位被翻转。那是j,2 * j,3 * j ......的位
被翻转。翻转总位数= floor(N / j)
(3)设L = LCM(i,j)。因此,L,2 * L,3 * L,......处的位将是
翻转两次,意味着比特不变是下限(N / L)
因此,在OP(i)和OP(j)之后,改变的总比特将是
楼层(N / i)+楼层(N / j) - 2 *楼层(N / L)
未改变的位数= N - 层数(N / i) - 层数(N / j)+ 2 *层数(N / L)
对于N = 11,i = 4,j = 3,L = LCM(3,4)= 12,
未改变的位数= 11 - 11/4 - 11/3 + 11/12 = 11 - 2 - 3 + 0 = 6
答案 1 :(得分:1)
public static int nochange_bits(String input1,int i1,int i2)
{
try{
int len=input1.length();
if(i1<1 || i2<1){
return -1;
}else if(i1>len && i2>len){
return len;
}else if(i1==i2){
return len;
}else{
return (int)(len-Math.floor(len/i1)-Math.floor(len/i2)+2*Math.floor(len/(Math.abs(i1*i2) / GCF(i1, i2))));
}
}catch(Exception e){
e.printStackTrace();
return -1;
}
}
public static int GCF(int a, int b) {
if (b == 0) return a;
else return (GCF (b, a % b));
}
a)首先,我们检查输入的所有条件和无效性 b)然后我们计算LCM以获得输出
说明:它类似于翻转开关问题, 首先我们切换i1位 第二轮我们切换i2位
在此过程中,具有LCM(i1,i2)的位被反转。
所以我们将lcm添加回总数