数拆成y=2^n1+2^n2+……这个算法实现心得

<script type="text/JavaScript"> </script> <script src="http://a.alimama.cn/inf.js" type="text/javascript"></script>

最开始,我尝试着用乘方来试探,比如用Math.Pow从0开始一直乘方下去,并加其和,直到小于y为止,可是这是个很荒谬的设计,结果当然有问题。

后来与各同行们探讨,有的建议递归,也有建议用数组,其实给我眼睛一亮的建议就是二进制。比如8=2^3,9=2^3+2^0,其实就是转换二进制的过程,8=1000,9=1001。这令我想到了当时学校的数学知识,这就是求得这个算法的最佳解决方案。

以下是一个同事提供的方案,我做了部分性能上修改:

        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)相比哪个效率高)
  

另外,心得后的心酸故事:

人常说,喜欢一个人,在一起很开心,爱一个人,不开心也想在一起。原话不知道怎么讲,反正是这个意思。我实现上面的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 <script type="text/JavaScript"> </script> <script src="http://a.alimama.cn/inf.js" type="text/javascript"></script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值