算法:计算1的个数

昨天看到csdn上有一个关于google的面试题,题目的大致内容是,计算0~n之间的1的个数,例如n=12时,1的个数为5,为什么是5呢,大家可以计算一下 0-9有一个1,10-12有4个1。
下面是我的思路。
如果n的长度是1位,如果n>0那么结果是1,否则是0
如果n的长度大于1位,那么如果n>(n的长度位数数字的最小值*2-1),那么
f(n)=(n的最高位 * f(比n的长度小一位的最大数) + n的长度位数数字的最小值)。
否则
f(n)=(n的最高位 * f(比n的长度小一位的最大数) + n-比n的长度小一位的最大数)

下面是源代码:

public double f(double d)
  {
   const string strT = "1000000000000000000000000000";
   //判断参数d的长度
   int length = d.ToString().Length;   
   if(length == 1)
   {
    if(d>0)
    {
     return 1;
    }
    else
    {
     return 0;
    }
   }
   else
   {
    //取一个数,这个数是长度比参数d少一位的最大的数,例如如果d=2300,那么d0=1000;
    double d0 = double.Parse(strT.Substring(0,length));
    //取一个数,这个数是长度比参数d少一位的最大的数,例如如果d=2300,那么d1=999;
    double d1 = double.Parse(strT.Substring(0,length)) - 1;
    //取一个数,这个数是用来判断应该取什么值的。例如参数d的长度是两位,那么这个数就是19,如果是3为,那么是199
    double d2 = double.Parse("1"+ d1.ToString());
    //取参数的首位的数字
    int iMaxStart = int.Parse((d.ToString())[0].ToString());
    //取参数的除首位以外的其他数值
    double dOther = double.Parse(d.ToString().Substring(1,length-1));

    if(d > d2)
    {
     return ( iMaxStart * f(d1) + f(dOther) + d0);
    }
    else
    {
     return (iMaxStart * f(d1) + f(dOther) + (d - d1));
    }
   }
  }

运行结果:
1000000000000的运行时间为:156毫秒
计算f(n) =n的时间是:29.406秒
我的机器:P4 2.6  512 内存


转载于:https://www.cnblogs.com/ami/archive/2006/07/20/455679.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值