2个数字的公因数是什么
what will be the common factor in 2 numbers.?
通常,我们发现两个数字之间的共同因数将 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,因此循环肯定会终止,当 a
和 b
都是 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);
}
为什么会这样?我将把它作为读者的练习;)
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 2个数字的公因数是什么