#include <iostream>
#include <math.h>
using namespace std;
int Binary2Decimal(int n){
static int ex=-1;
ex++;
if(n%10!=n){
return Binary2Decimal(n/10)+(pow(2,ex)*(n%10));
}
else{
return pow(2,ex)*n;
}
}
int main(){
int n;
cout<<"input a binary:\n";
cin>>n;
cout<<"Output:\n"<<Binary2Decimal(n);
}
想問一下哪裡出了問題
你的邏輯我有點不大會思考,
我改成這樣子你試試看
#include <iostream>
#include <math.h>
using namespace std;
int Binary2Decimal(int num) {
if (num >= 10) {
int dev = num / 10;
int mod = num % 10;
return Binary2Decimal(dev) * 2 + mod;
}
else {
return num;
}
}
int main() {
int n;
cout << "input a binary:";
cin >> n;
cout << "Output:" << Binary2Decimal(n) << endl;
system("pause");
}
關鍵原因是在那個 ex
你以為 ex 是 -1,0,1,2,3...逐漸加一
在「去程」是如此沒錯
然而實際在遞迴的「回程」路上 ex 已經是最後一個值
也就造成答案不是 8+4+0+1 (以 1101 為例, ex=3)
而是 8+8+0+8 (2^3 加三次)
修正方法是「用另一個變數把 ex 計算出的值存起來」
改成以下即可(Line A,B)
int Binary2Decimal(int n){
static int ex=-1;
ex++;
if(n%10!=n){
int digit = (pow(2,ex)*(n%10)); // Line A
return Binary2Decimal(n/10)+digit; // Line B
}
else{
return pow(2,ex)*n;
}
}