2个数字的公因数是什么

what will be the common factor in 2 numbers.?

本文关键字:是什么 公因数 数字 2个      更新时间:2023-10-16

通常,我们发现两个数字之间的共同因数将 8 和 12 表示为 4。但是在编程语言中,我想在两个数字都除以 2 时找到公共数字。我们将两个数字除以 2 并检查公共数字像数字 8 和 118->4->211->5->2她的我们得到 2 作为公共数字。我想为高达 10^9 的数字有效地实现它。她的是我的实施

long long i,j;
while(i!=1||j!=1)
{
    i=i/2;
    j=j/2;
    if(i==j)
    flag=1;
    break;
}

但是我和J在不同的时间是相同的。如何实现?

您可以在更复杂的逻辑中执行此操作 - 使用两个数字并始终除以其中较大的数字:

int get(int a, int b) {
  while (a != b) {
    if (a < b) {
      swap(a, b);
    }
    a /= 2;
  }
  return a;
}

解释:最终任何正整数除以 2 时都会得到 1,因此循环肯定会终止,当 ab 都是 1 时,这种情况会发生。在每一步中,我确保 a 不小于 b,然后将其除以 2。

我想在两个数字都除以 2 时找到公共数字

你的问题有点模糊。我假设你想找到 2 的最大共同分度力?

2 的幂可以很容易地在二进制中检测到,因为它们的尾随零:

  1    00000001
  2    00000010
  4    00000100
  8    00001000
 16    00010000
 32    00100000
 64    01000000
128    10000000

所有素数分解中只有一个 2 的数字只有一个尾随零:

  2    00000010    2
  6    00000110    2*3
 10    00001010    2*5
 14    00001110    2*7
 18    00010010    2*3*3

您可以对 4、8、16 等的倍数执行相同的操作,并得出结论,您可以通过二进制表示中的尾随零数来检测数字中 2 的幂。

2 的倍数(不是 4 的倍数)将以 10 结尾,4 的倍

数(不是 8 的倍数)将以 100 结尾,依此类推。最右边的 1 之前的位对我们来说并不有趣。

所以我们要做的是隔离最右边的1位。幸运的是,有一个不错的技巧:

int rightmost_bit(int x)
{
    return x & -x;
}

这是如何工作的?如果你看一下二进制补码中x-x的二进制表示,它们只共享一个 1 位,即最右边,这正是我们感兴趣的那个:

           *
 40    00101000
-40    11011000
&          *
  8    00001000

x最右边的所有位在-x中也是0,而-x左侧的所有位都与x中的位相反,因此当它们与二进制-and组合时,它们会相互抵消。

因此,找到 2 的最大公分幂的天真方法是:

int gcd_p2_naive(int a, int b)
{
    return std::min(rightmost_bit(a), rightmost_bit(b));
}

但是我们可以通过另一个简单的小技巧做得更好,我刚刚想出了一个:

int gcd_p2(int a, int b)
{
    return rightmost_bit(a | b);
}

为什么会这样?我将把它作为读者的练习;)