iT邦幫忙

0

用"遞迴"作二進位轉十進位

c++
  • 分享至 

  • xImage
#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);
}

想問一下哪裡出了問題

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
小魚
iT邦大師 1 級 ‧ 2019-11-27 22:11:03
最佳解答

你的邏輯我有點不大會思考,
我改成這樣子你試試看

#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");
}
看更多先前的回應...收起先前的回應...

這樣輸入1011後會得到13 1100會得到3呢 @_@

小魚 iT邦大師 1 級 ‧ 2019-11-27 22:36:28 檢舉

我又改過了.
你動作這麼快.
這次這樣子寫才是真正的遞迴.

當然哈哈 問人家問題態度還是得積極一點XD
前輩的algorithm好特別
正常來講都會往 (a1乘2^0)+(a2乘2^1)+...+(an乘2^(n-1))
這樣的方向去想

不過像
1001:
B(100)*2+1
B(10)*2+0
B(1)*2+0
1
照前輩的演算法底層的2可以回到上層再乘
剛剛理解了一下 蠻厲害的:) 感謝~

小魚 iT邦大師 1 級 ‧ 2019-11-27 23:50:48 檢舉

太久沒寫遞迴了,
一開始還卡住,
以前遞迴都是從階乘開始,
其實在寫遞迴都是先考慮終點在哪裡,
從終點往回推要怎麼計算.

半夜不睡覺還在寫code (鞭打

0
海綿寶寶
iT邦大神 1 級 ‧ 2019-11-28 10:04:42

關鍵原因是在那個 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;
	}
}

我要發表回答

立即登入回答