gpt4 book ai didi

c++ - 计算 (2^k)m=input 的递归函数

转载 作者:行者123 更新时间:2023-11-30 05:34:43 24 4
gpt4 key购买 nike

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 并找到 mk 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com