update2:现在它对偶数有效,但对奇数无效,当 m 为偶数时有效,而当 m 为奇数时无效。
void find2Factor(int num, int& k, int& m)
{
if (num % 2 == 1)
m = num;
else
m = num - 1;
k = 1;
fin2FactorRec(num, k, m);
}
void fin2FactorRec(int num, int& k, int& m)
{
if (m*k == num)
{
k = powerof2(k);
return;
}
else if (num%m==0)
fin2FactorRec(num, k *= 2, m);
else
fin2FactorRec(num, k, m -= 2);
}
int powerof2(int n)
{
int count = 1;
while (n != 2)
{
n /= 2;
count++;
}
return count;
}
update1:编辑为以下内容,但它卡在第一个递归上,无法进入第二个递归。
void find2Factor(int num, int& k, int& m)
{
k = m = 1;
fin2FactorRec(num, k, m);
}
void fin2FactorRec(int num, int& k, int& m)
{
if (k*m == num)
return;
if (num == m)
return;
else
{
find2Factorrec(num, k, m += 2);
find2Factorrec(num, k *= 2, m);
}
}
我想编写一个函数 find2Factor
获取整数 input,k,m 并找到 m
和 k
input=( 2^k)*m 而 k 不小于 0(k 可以为 0)
m为奇数。
这是我必须在不更改的情况下使用的一段代码:
int main() {
int num, k, m;
cin >> num;
find2Factor(num, k, m);
cout << k << " " << m << endl;
}
这就是我编写函数 find2Factor
的方式:
void find2Factor(int num, int& k, int& m)
{
k = m = 0;
if (k*m == num)
return;
if (num == m)
return;
else
{
find2Factor(num, k, m += 2);
find2Factor(num, k*2, m);
}
}
但它总是初始化 k 和 m 而我只是希望它们在开始时被初始化...
非常感谢您的帮助
最佳答案
如果您不能更改 main,那么您将需要一个函数来进行设置,以及一个递归函数。
否则,在调用 find2Factor 之前在 main 中初始化 m 和 k。
评论后编辑:
第二次调用不起作用,因为 m 和 k 已经超过了它们的限制。
当使用递归时,我更喜欢按值传递参数,因为当从不成功的调用返回时,它可以更容易地将它们恢复到以前的值。函数签名可能如下所示:
bool internalFind2Factor(int num, int k, int k_pow, int m, int& res_k, int& res_m)
如果返回值表示成功,k_pow 将保存 2**k,res_k 和 res_m 将包含成功时的答案。
我还会尝试在不同的代码路径中递增增量 k 和 m,并确保在一次调用成功时停止递归。
关于c++ - 计算 (2^k)m=input 的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34122357/