update2:现在它对偶数有效,但对奇数无效,当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
,它得到整数输入k,m,并找到m
和k
的输入=(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,并确保如果一个调用成功,我们将停止递归。