当前位置: 首页 > news >正文

算法:计算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

相关文章:

  • bp网络实现预测
  • 亭中避雨
  • SQL_VARIANT_PROPERTY 返回有关 sql_variant 值的基本数据类型和其他信息
  • 我宣布~~~~~
  • 调整参数对bp网络的影响
  • 协作应用程序标记语言 (CAML)---Query语法示例
  • 用BP网络完成函数的逼近
  • 天终于凉快了!开始工作哦
  • ArcSDE vs. oracle Spatial 4
  • VS2005制作安装包的“系统必备”选项
  • 训练前后bp网络仿真结果分析
  • 如何从SAP中连接其他数据库
  • SQL简繁转换函数
  • 政府部门信息化人员的定位
  • 世界上最成功的人一开始是个程序员-《程序员大本营》1999版
  • 【css3】浏览器内核及其兼容性
  • axios 和 cookie 的那些事
  • exports和module.exports
  • golang中接口赋值与方法集
  • JS函数式编程 数组部分风格 ES6版
  • Linux CTF 逆向入门
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • php中curl和soap方式请求服务超时问题
  • Python打包系统简单入门
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 近期前端发展计划
  • 排序(1):冒泡排序
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端自动化解决方案
  • 小试R空间处理新库sf
  • 正则与JS中的正则
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​ArcGIS Pro 如何批量删除字段
  • ​queue --- 一个同步的队列类​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # 数据结构
  • #1014 : Trie树
  • (03)光刻——半导体电路的绘制
  • (a /b)*c的值
  • (C++17) std算法之执行策略 execution
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)计算机毕业设计高校学生选课系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (转)3D模板阴影原理
  • (转载)利用webkit抓取动态网页和链接
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET 简介:跨平台、开源、高性能的开发平台