翻转一点并告诉翻转后位数保持不变

Flipping a bit and to tell the number of bits remain same after flipping

我被下面的问题弄糊涂了。 翻转一位意味着将位从 0 更改为 1,副 versa.An 操作 OP(i) 将导致翻转二进制数字,如下所示。 执行 OP(i) 将导致从开始 i>0

开始翻转每个第 i 位

一个n位数作为输入,OP(j)和OP(k)相继应用于它。 Objective是指定应用这两个操作后有多少位保持不变。

当我应用逻辑 floor(n/i)+floor(n/j)-2 时,它没有给我预期的解决方案。 例子: 二进制 number:10110101101 i:3 j:4 预计 output:6 但是我 3.Please 告诉我如何解决这个问题。 我也检查了这个解决方案。但是他们也提到了相同的逻辑。

让寄存器包含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, ... 的位将是
翻转两次,意味着不变的位是 floor(N/L)

因此,在 OP(i) 和 OP(j) 之后,更改的总位数将为
楼层(N/i) + 楼层(N/j) - 2*楼层(N/L)
未更改的位数 = N - floor(N/i) - floor(N/j) + 2*floor(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

 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 加回到总数中