我正在使用C ++编写一个程序,该程序使用递归将用户输入二进制数转换为小数。我玩了几个小时的代码
(之前我使用i
初始化i = binary.length();
)
void bin2dec(string binary, int i)
{
double decNum=0;
if (i >= 0)
{
if (binary[i] = 0)
{
decNum = (decNum + 0);
}
else
{
decNum = (decNum + pow(2, (i-1)));
}
bin2dec(binary, i-1);
}
cout << decNum;
}
这是我的递归函数。不幸的是,我被困住了。该程序运行但给我不正确的值。例如,当我插入1作为二进制时,我希望得到1小数作为回报。但我得到.5号码。我的计算错了还是我错误地使用了递归?
收到建议后,我做了以下更改。但是,程序仍然返回不正确的值。
void bin2dec(string binary, int i)
{
double decNum=0;
if (i >= 0)
{
if (binary[i] == 1)
{
decNum = (decNum + pow(2, i));
}
else if (binary[i] == 0)
{
decNum = (decNum + 0);
}
bin2dec(binary, i - 1);
cout << decNum;
}
}
答案 0 :(得分:3)
假设您使用的是小端,则应使用pow(2, i)
。使用i-1
,数组中的位置0将为1,这意味着您将评估pow(2, -1)
,即0.5。
考虑这个工作示例(https://ideone.com/pWVAGP):
int bintodec(string binary, unsigned int i = 0)
{
int tot = 0;
if (i < binary.length())
{
if (binary[i] == '1')
tot = pow(2, i);
else if (binary[i] != '0')
throw "String is not formatted in binary";
return tot + bintodec(binary, ++i);
}
return tot;
}
请注意,可以从字符串的末尾开始并向后工作,但我更喜欢从0开始,因为我觉得它更简单。要总计你的添加内容,最简单的方法是返回函数的另一个调用,就像我在if(i < binary.length()
块结束时所做的那样。一旦你遇到基本情况(在这种情况下i == binary.length()
),返回一个0,它被添加到总数但不会改变它。一旦基本案例返回,其他人将开始将他们的部分金额返回到他们上面的一部分,这将继续加回,直到它到达调用堆栈的底部,这是原始调用函数。
如果您不想返回答案,可以将功能签名更改为void bintodec(int& tot, string binary, unsigned int i = 0)
并继续将值添加到tot
而不是将其返回,但它要求您的来电者给您一个int
要修改。
答案 1 :(得分:1)
class trip
{
int convert2(int N, int i)
{
if(N!=0)
{
return (N%10)*((int)Math.pow(2,i))+convert2(N/10,i+1);
}
else
{
return 0;
}
}
}
答案 2 :(得分:0)
上述算法略有改进的版本;不使用pow()
函数的是:
int btod_r(int n, int p = 0) {
if(n == 0) return 0;
if(p == 0) return n%10 + btod_r(n/10, 2);
return (n%10) * p + btod_r(n/10, 2*p);
}
注意:此处的二进制输入为int
,只需稍加修改即可重新编写,以接受string
。
答案 3 :(得分:0)
解决方案:
int bin2dec(long long num)
{
if(num==0) return 0;
return num%10+2*bin2dec(num/10);
}