【发布时间】:2020-09-30 04:55:51
【问题描述】:
在 C++ 中给出以下内容:
$$k = 2^a \cdot b,$$
只知道 k 的值并且 b 是奇数。如何找到 a 的值和 b 的值?
我确实考虑了以下几点:
- 如果 k 是奇数,a 必须为零,b 是 k
- 如果 k 是偶数,我会使用 for 循环遍历所有可能的 b,并检查是否 k % b == 0。如果是这种情况,我将采用 log2(k/b),如果这给了我返回一个整数,b = k/b 和 a = log2(b)。
我的问题:如何检查 log2(k/b) 是否返回整数?
C++ 代码:
Big k(9);
int r = 4;
int n = pow(2,r);
if (k % 2 == 1)
{
a = 0;
b = k;
}
else
{
for (int b = 1; b < n; b += 2)
{
if (k % b == 0 && LOGARITHM OF k / b IS POSSIBLE)
{
a = log2(b);
}
}
}
顺便说一句:n 也给出了。除了 a 和 b 之外的所有东西都给出了。
【问题讨论】:
-
考虑 2a 代表什么,并查看一些示例(k == 4 或 k == 6)。
-
你能显示完整的代码吗?
k是什么类型的? -
k 的类型为 Big
-
@KuroiRyū 什么是“大”?
-
关于
pow的快速说明:它对浮点数进行操作,而浮点数并不精确。你会发现你期望一个不错的整数,但却得到一个略高于或低于预期的数字。随着数字变大并且可表示数字之间的空间增加,这种差异变得越来越大。即使您管理接近预期的数字并将它们转换回整数,稍微低一点的数字也会被截断,你会结束减一。
标签: c++ algorithm math cryptography