剑指Offer30 从1到n整数出现1的个数
- /*************************************************************************
- > File Name: 30_NumerOf1.c
- > Author: Juntaran
- > Mail: JuntaranMail@gmail.com
- > Created Time: 2016年09月01日 星期四 20时46分06秒
- ************************************************************************/
- #include <stdio.h>
- // 计算1在n中出现的次数
- int CountOne(int n)
- {
- int count = ;
- for (; n > ; n /= )
- {
- if (n % == )
- count ++;
- }
- return count;
- }
- int NumberOfOne(int n)
- {
- if (n <= )
- return ;
- int count = ;
- for (int i = ; i <= n; ++i)
- count += CountOne(i);
- printf("1 appear %d times\n", count);
- return count;
- }
- /*
- 数学公式法:
- 设定整数点(如1、10、100等等)作为位置点i(对应n的各位、十位、百位等等),
- 分别对每个数位上有多少包含1的点进行分析
- 根据设定的整数位置,对n进行分割,分为两部分,高位n/i,低位n%i
- 当i表示百位,且百位对应的数>=2,如n=31456,i=100,则a=314,b=56,
- 此时百位为1的次数有a/10+1=32(最高两位0~31),
- 每一次都包含100个连续的点,即共有(a%10+1)*100个点的百位为1
- 当i表示百位,且百位对应的数为1,如n=31156,i=100,则a=311,b=56,
- 此时百位对应的就是1,则共有a%10(最高两位0-30)次是包含100个连续点,
- 当最高两位为31(即a=311),本次只对应局部点00~56,共b+1次,
- 所有点加起来共有(a%10*100)+(b+1),这些点百位对应为1
- 当i表示百位,且百位对应的数为0,如n=31056,i=100,则a=310,b=56,
- 此时百位为1的次数有a/10=31(最高两位0~30)
- 综合以上三种情况,当百位对应0或>=2时,有(a+8)/10次包含所有100个点,
- 还有当百位为1(a%10==1),需要增加局部点b+1
- 之所以补8,是因为当百位为0,则a/10==(a+8)/10,当百位>=2,补8会产生进位位,
- 效果等同于(a/10+1)
- */
- int NumberOfOne2(int n)
- {
- int count = ;
- for (long long m = ; m <= n; m *= )
- {
- count = count + (n/m + ) / * m + (n/m % == ) * (n%m + );
- }
- printf("1 appear %d times\n", count);
- return count;
- }
- int main()
- {
- int n = ;
- NumberOfOne(n);
- NumberOfOne2(n);
- }
剑指Offer30 从1到n整数出现1的个数的更多相关文章
- 剑指 Offer 43. 1~n 整数中 1 出现的次数 + 数位模拟 + 思维
剑指 Offer 43. 1-n 整数中 1 出现的次数 Offer_43 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author ...
- 剑指Offer30——包含min函数的栈
剑指Offer30--包含min函数的栈 1. 题目简述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min.push及pop的时间复杂度是O(1). 2. 题 ...
- 剑指Offer - 九度1513 - 二进制中1的个数
剑指Offer - 九度1513 - 二进制中1的个数2013-11-29 23:35 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. ...
- 剑指offer-面试题11.数值的整数次方
题目:实现函数double Power(double base,int exponent),求base的 exponent次方.不得使用库函数,同时不需要考虑大数的问题. 这道题看似很简单: 然而需要 ...
- 剑指Offer 把字符串转换成整数
题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法 ...
- 剑指offer 12:数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. public class Solution { public double P ...
- 剑指Offer——把字符串转换成整数
题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果 ...
- 剑指offer--30.二叉搜索树的后序遍历序列
正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...
- 剑指offer--15.把字符串转换成整数
stringstream做这个真的很舒服 ------------------------------------------------------------------------------- ...
随机推荐
- 错误"因为数据库正在使用,所以无法获得对数据库的独占访问权"的解决方案
今天在还原数据库的时候,提示"因为数据库正在使用,所以无法获得对数据库的独占访问权",无论我是重启数据库,还是重启计算机,都不能解决问题,多番尝试后,终于解决了该问题.现将引发该问 ...
- android 小知识点
小知识点总结 1. android中MotionEvent.ACTION_CANCEL事件如何被触发? 对于这个问题,android文档的说明很简短,想看明白很难.国外一网页说的还比较详细,写在这里分 ...
- box-shadow 同时有内阴影和外发光效果
box-shadow: 0px 0px 10px rgba(0,0,0,0.8) inset,0px 0px 5px rgba(200,200,200,0.5);
- C#调用webService的几种方法
转自: WebClient 用法小结 http://www.cnblogs.com/hfliyi/archive/2012/08/21/2649892.html http://www.cnblogs. ...
- C#之 HashSet(临时笔记,未参考资料,请慎重)
HashSet是一个集合,类似于DataSet,但是其主要用途是用来存放同一种类型的元素(string.row.table等),如果添加的元素跟定义时初始的类型不一致,就会直接编译失败. 例如: Ha ...
- Number
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt 概述 parseIn ...
- spring AOP Bean添加新方法
目的:为studentAdditionalDetails中添加Student的showDetails()和ExtraShowDetails()两个方法 spring 中AOP能够为现有的方法添加额外 ...
- center os 6.5 vsftpd 登陆出现 530 错误拒绝 解决方法
别管那么多 把 /etc/vsftpd/ftpusers 里面的用户名删掉就好了.
- missing artifact com.oracle:ojdbc14:jar:10.2.0.2.0解决办法
下载jar,导入到maven中 下载:http://download.csdn.net/detail/spring123tt/6991897 cmd中输入: mvn install:install-f ...
- IDA Script: Remove empty auto labels
http://simeonpilgrim.com/blog/2010/03/25/ida-script-remove-empty-auto-labels/ #include <idc.idc&g ...