最開始,我嘗試著用乘方來試探,比如用Math.Pow從0開始一直乘方下去,並加其和,直到小於y為止,可是這是個很荒謬的設計,結果當然有問題。
後來與各同行們探討,有的建議遞迴,也有建議用數組,其實給我眼睛一亮的建議就是二進位。比如8=2^3,9=2^3+2^0,其實就是轉換二進位的過程,8=1000,9=1001。這令我想到了當時學校的數學知識,這就是求得這個演算法的最佳解決方案。
/// <summary><br /> /// Convert decimal number to y=2^n1+2^n2+……<br /> /// </summary><br /> /// <param name="number">type:long</param><br /> /// <returns>note: return the string not the number</returns><br /> public static string ConvertToBinaryPower(long number)<br /> {<br /> //convert number to binary string<br /> var strBinary = Convert.ToString(number, 2);<br /> //define the result<br /> var strResult = number + "=";<br /> for (int i = strBinary.Length - 1, j = 0; i >= 0; i--, j++)<br /> {<br /> if (strBinary[i] == 49)//49 here is '1'<br /> {<br /> strResult += "2^" + j;<br /> if (i > 0)//if is the last one, need not add '+'<br /> {<br /> strResult += "+";<br /> }<br /> }<br /> }<br /> return strResult;<br /> }
以下是一個同事提供的方案,我做了部分效能上修改:
static string BuildString(long iNumber) { StringBuilder strResult =new StringBuilder(iNumber + "="); for (var i = iNumber.ToString().Length * 4; i >= 0; i--) { if ((iNumber - (long)Math.Pow(2, i)) >= 0) { iNumber = iNumber - (long)Math.Pow(2, i); strResult.Append("2^" + i.ToString() + "+"); } } strResult.Length--; return strResult.ToString(); } |
另外,十進位轉換為二進位的自訂演算法:(但是我上面沒有用到這個自訂轉換,不清楚與Convert.ToString(number, 2)相比哪個效率高) /// <summary><br /> /// Convert decimal number to binary number<br /> /// </summary><br /> /// <param name="number">decimal number</param><br /> /// <returns>return the binary number (type:string)</returns><br /> public static string ConvertDecimalToBinary(long number)<br /> {<br /> long[] temp = new long[100];//as the type is long, the length 100 is enough<br /> //if 0, will not be converted<br /> if (number == 0) return (number.ToString());<br /> var i = 0;<br /> while (number != 0)<br /> {<br /> temp[i++] = number % 2;<br /> number /= 2;<br /> }<br /> var strBinary = "";<br /> for (var j = 0; j <= i - 1; j++)<br /> strBinary += (char)(temp[i - j - 1] + 48);//48 here means the char '0'<br /> return (strBinary);<br /> }
另外,心得後的心酸故事:
人常說,喜歡一個人,在一起很開心,愛一個人,不開心也想在一起。原話不知道怎麼講,反正是這個意思。我實現上面的y=2^n1+2^n2+……演算法,其實就是想設計出下面這樣一個公式來:
L + O + V + E = ABCXYYX + ABC*107 + ((AB) 2 + AC)*106 + XXY + X + Y + BC |
我曾經為了追求她,哄她開心,將L, O, V, E用我和她的手機號代入(我們倆每人兩個手機,所以有四個號碼),A=5,B=2, C=0,X=13,Y=14,分別代入:
134×××××××× + 138×××××××× + 137×××××××× + 189×××××××× = 5201314 + 520*107 + ((52) 2 + 50)*106 + 131314 + 13 + 14 + 20 |
等式成立,其實想對她表達我的用心和一生一世的愛,520*107足以超過“我愛你一萬年”了。我僅用5,2,0,1,3,1,4和冪組成,來等於四個手機號之和(L,O,V,E)。
最後,只可惜,這是一個悲劇,用心良苦,最後還是難免遭受挫折。
轉自:http://www.cnblogs.com/architect/archive/2009/03/04/1402823.html