數拆成y=2^n1+2^n2+……這個演算法實現心得

來源:互聯網
上載者:User

最開始,我嘗試著用乘方來試探,比如用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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.