這幾天在複習計算機原理,看到二進制突然想到二進制轉10進制的公式,而後轉念一想10進制轉二進制的公式好像沒印象,那索性本身寫出來。函數
結果學渣的我發現,並不能寫出來!什麼數列,對數,xx函數忘得一乾二淨,並且須要有須要判斷的地方,因而崩潰了,之前代數題並沒寫過條件啊~測試
索性用C#代碼搞出來(雖然在C#裏有方法直接轉換)spa
二進制值 | 10進制值 | 公式 |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
10 | 2 | f(2)=10^1 =10 |
11 | 3 | f(3):比 log₂3最小的整數位1,記錄10^1,並3-(2^1)=1,f(1)=1,則最終結果爲10^1+f(1)=10+1=11 |
100 | 4 | f(4): log₂4=2,整數,直接返回10^2 |
101 | 5 | f(5):比 log₂5最小的整數位2,記錄10^2,並5-(2^2)=1,f(1)=1,則最終結果爲10^2+f(1)=100+1=101 |
110 | 6 | f(6):比 log₂6最小的整數位2,記錄10^2,並6-(2^2)=2,f(2)=10,則最終結果爲10^2+f(2)=100+10=110 |
111 | 7 | ……………… |
1000 | 8 | ……………… |
1001 | 9 | ……………… |
1010 | 10 | ……………… |
1011 | 11 | ……………… |
1100 | 12 | ……………… |
1101 | 13 | ……………… |
1110 | 14 | ……………… |
1111 | 15 | f(15):比 log₂15最小的整數位3,記錄10^3,並15-(2^3)=7,f(7)=111,則最終結果爲10^3+f(7)=1000+111=1111 |
10000 | 16 | f(16):比 log₂6最小的整數位4,整數,直接返回10^4 |
公式是這樣子的。 假如求10進制數n的二進制,先求以2爲底的n的對數log₂N,判斷log₂N是否爲爲整數,若是爲整數直接返回10^log₂N,不然求出比log₂N最小的整數t(如1.001取1,2.02取2,3.9取3)。求出並記錄10^t,而後將n減去2^t並重復執行以上步驟,返回的值與記錄的10^t相加。code
以上咱們設這個函數爲f(n);orm
貼代碼,無疑,用了遞歸~blog
private double DecimalToBinarySystem(int decimalNumber) { double standard = 0; if (decimalNumber==0) { return 00; } if (decimalNumber==1) { return 01; } var doubleValue = (double) decimalNumber; var logarithm = Math.Log(doubleValue,2 ); var logFormat = Math.Truncate(logarithm); var baseNum = Math.Pow(10, logFormat); if (logarithm.Equals(logFormat)) { return baseNum; } var leftNumber = doubleValue - Math.Pow(2, logFormat); return baseNum + DecimalToBinarySystem((int)leftNumber); }
僅測試過大於等於0的整數,負數和小數未測試。遞歸
只是樂於思考一下,拋磚引玉歡迎指正ci