编程之美----1的数目

问题:1,写一个函数f(N),返回1到N之间出现的”1"的个数。2,满足条件“f(N)=N"的最大的N是多少?

解法:对于之间的每一个数字n,分情况讨论每一个数位出现1的个数,例如要计算百位上出现1的次数,它将会受到三个因素的影响:百位上的数字,百位以下(低位)的数字,百位(更高位)以上的数字。如果百位上的数字为0,可知,百位上可能出现1的次数由更高位决定,并且等于更高位数字*当前位数。如果百位上的数字为1,可知,百位上的数字可能出现1的次数不仅受更高位影响,还受低位影响。如果百位上数字大于1,则百位上可能出现1的次数仅由更高位决定,并且等于更高位数字加1,再乘以当前位数。

 1 LONGLONG Sumls(ULONGLONG n)
 2 {
 3     ULONGLONG iCount = 0;
 4     ULONGLONG iFactor = 1;
 5     ULONGLONG iLowerNum = 0;
 6     ULONGLONG iCurrNum = 0;
 7     ULONGLONG iHigherNum = 0;
 8     while(n / iFactor !=0)
 9     {
10         iLowerNum = n - (n / iFactor) * iFactor;
11         iCurrNum = (n / iFactor) %10;
12         iHigherNum = n / (iFactor * 10);
13
14         switch(iCurrNum)
15         {
16         case 0:
17             iCount += iHigherNum * iFactor;
18             break;
19         case 1:
20             iCount += iHigherNum * iFactor + iLowerNum + 1;
21             break;
22         default:
23             iCount += (iHigherNum + 1) * iFactor;
24             break;
25         }
26         iFactor *= 10;
27     }
28     return iCount;
29 }

问题二用类似数学归纳法的思路 当n增加10k 时,f(n)至少增加k*10k-1

时间: 2024-10-26 13:33:51

编程之美----1的数目的相关文章

LeetCode-Number of Digit One(编程之美-1的数目)

Given an integer n, count the total number of digit 1 appearing in all non-negative integers less than or equal to n. For example: Given n = 13, Return 6, because digit 1 occurred in the following numbers: 1, 10, 11, 12, 13. 题不难但是很难分析,首先我们想到的就是分解问题,找

编程之美读书笔记2.15 - 子数组之和的最大值(二维)

http://blog.csdn.net/pipisorry/article/details/39083073 问题: 求二维数组(矩阵)的子矩阵之和的最大值. 亦可见:http://poj.org/problem?id=1050 解法1:(解释见注释) 每个子矩阵由列长.行长和左上角的元素位置决定.如果我们指定左上角的元素位置 (i,j) 和列长 c,那么可以求所有这些子矩阵中和最大的.然后,变化列长 c,可以求以 (i,j) 为左上角的最大和子矩阵.最所有左上角位置再求最大和子矩阵,问题就解

编程之美之实时排名算法

首先来看一个实时排名算法 参考文献 某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新.现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名.用户最大规模为2亿:积分为非负整数,且小于100万. 存储结构 首先,我们用一张用户积分表user_score来保存用户的积分信息. 表结构: 示例数据: 下面的算法会基于这个基本的表结构来进行. 算法1:简单SQL查询 首先,我们很容易想到用一条简单的SQL语句查询出积分大于该用户积分的用户数量: select 1 + count(t

编程之美-小飞的电梯调度算法另一种解

放暑假了,在家闲着也是闲着,翻一翻去年买的<编程之美>这本书,有一些收获.昨天看到小飞的电梯调度算法这个问题,思考一番,得到了和书中给出的标准答案不一样的解决方法. 一.问题描述: 亚洲微软研究院所在的希格玛大厦一共有6部电梯.在高峰时间,每层都有人上下,电梯在每层都停.实习生小飞常常会被每层都停的电梯弄得很不耐烦,于是他提出了这样一个办法:由于楼层并不算太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的某一层.所有乘客从一楼上电梯,到达某层后,电梯停下来,所有乘客

编程之美-1的个数

1的数目 题目:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现所有"1"的个数. 例如: N=2,写下1~2.这样只出现了1个"1". N=12,我们会写下1,2,3,4,5,6,7,8,9,10,11,12,这样,1的个数是5. 问题是: 1.写一个函数F(N),返回1到N之间出现的"1"的个数,比如F(12)=5; 2.满足条件"F(N)=N"的最大的N是多少?   我们就先来看看问题1的解法吧:

编程之美--3.8

题目描述:求二叉树节点的最大距离,距离是节点之间边的数目 思路:递归判断左子树右子树以及经过当前节点的值的大小 1 #include <iostream> 2 #include <queue> 3 #include <climits> 4 #include <algorithm> 5 #include <memory.h> 6 #include <stdio.h> 7 #include <ostream> 8 #inclu

编程之美--信号量与互斥锁选择(转)

编程之美--多线程高效下载的问题 2011-03-27 15:27:12 分类: C/C++ 基本的思路: 这个问题相当于是生产者和消费者模型的问题 首先定义两个线程,一个是下载线程,一个是存储线程,下载线程将数据从网络上下载到相应的数据的缓冲区中(BLOCK组成的队列).存储的线程从数据缓冲区中读取相应的数据,并将其写到相应的磁盘上去. 多线程同步的方式有:CriticalSection.Mutex和Semaphore(信号量).因为CriticalSection和Mutex,将不会使下载线程

编程之美-分层遍历二叉树

问题:给定一个二叉树,要求按分层遍历该二叉树,即从上到下按层次访问该二叉树(每一层将单独输出一行),每一层要求访问的顺序为从左到右,并将节点依次编号.那么分层遍历如图的二叉树,正确的输出应该为: <span style="font-size:14px;">1 2 3 4 5 6 7 8</span> 书中还给出了问题2:打印二叉树中的某层次的节点(从左到右),其中根结点为第0层,成功返回true,失败返回false 分析与解法 关于二叉树的问题,由于其本身固有的

读书问题之《编程之美》 -----12061161 赵梓皓

我阅读的书是<编程之美> 刚开始的时候阅读序,就觉得控制cpu利用率这个问题很好玩,所以重点看了这部分和解决办法,问题也都大部分是这部分的.那么问题就来了(挖掘机技术xxx?中国山东找蓝翔) 咳咳,问题在下面: 1.关于问题的提出.(也是一点点建议) 本书的主要内容是告诉读者如何思考问题和解决问题.但是提出问题也是很重要的,正如爱因斯坦所说“提出一个问题往往比解决一个问题更重要”,很多面试题(比如井盖为啥是圆的)我觉得正常人很少会想到.所以,这个问题是怎么想出来的...我很好奇.也希望作者能够