剑指Offer30 从1到n整数出现1的个数

 1 /*************************************************************************
 2     > File Name: 30_NumerOf1.c
 3     > Author: Juntaran
 4     > Mail: [email protected]
 5     > Created Time: 2016年09月01日 星期四 20时46分06秒
 6  ************************************************************************/
 7
 8 #include <stdio.h>
 9
10 // 计算1在n中出现的次数
11 int CountOne(int n)
12 {
13     int count = 0;
14     for (; n > 0; n /= 10)
15     {
16         if (n % 10 == 1)
17             count ++;
18     }
19     return count;
20 }
21
22 int NumberOfOne(int n)
23 {
24     if (n <= 0)
25         return 0;
26     int count = 0;
27     for (int i = 0; i <= n; ++i)
28         count += CountOne(i);
29
30     printf("1 appear %d times\n", count);
31     return count;
32 }
33
34 /*
35     数学公式法:
36     设定整数点(如1、10、100等等)作为位置点i(对应n的各位、十位、百位等等),
37     分别对每个数位上有多少包含1的点进行分析
38     根据设定的整数位置,对n进行分割,分为两部分,高位n/i,低位n%i
39
40     当i表示百位,且百位对应的数>=2,如n=31456,i=100,则a=314,b=56,
41     此时百位为1的次数有a/10+1=32(最高两位0~31),
42     每一次都包含100个连续的点,即共有(a%10+1)*100个点的百位为1
43
44     当i表示百位,且百位对应的数为1,如n=31156,i=100,则a=311,b=56,
45     此时百位对应的就是1,则共有a%10(最高两位0-30)次是包含100个连续点,
46     当最高两位为31(即a=311),本次只对应局部点00~56,共b+1次,
47     所有点加起来共有(a%10*100)+(b+1),这些点百位对应为1
48
49     当i表示百位,且百位对应的数为0,如n=31056,i=100,则a=310,b=56,
50     此时百位为1的次数有a/10=31(最高两位0~30)
51
52     综合以上三种情况,当百位对应0或>=2时,有(a+8)/10次包含所有100个点,
53     还有当百位为1(a%10==1),需要增加局部点b+1
54
55     之所以补8,是因为当百位为0,则a/10==(a+8)/10,当百位>=2,补8会产生进位位,
56     效果等同于(a/10+1)
57 */
58
59
60 int NumberOfOne2(int n)
61 {
62     int count = 0;
63     for (long long m = 1; m <= n; m *= 10)
64     {
65         count = count + (n/m + 8) / 10 * m + (n/m % 10 == 1) * (n%m + 1);
66     }
67     printf("1 appear %d times\n", count);
68     return count;
69 }
70
71 int main()
72 {
73     int n = 12;
74     NumberOfOne(n);
75     NumberOfOne2(n);
76 }
时间: 2024-10-09 20:12:34

剑指Offer30 从1到n整数出现1的个数的相关文章

[剑指offer]Q11:数值的整数次方

pow(base, exponent) 考虑一下几种情况: base = 0, 那么直接返回0 base = 1, 那么直接返回1 exponent = 0, 那么直接返回1, 注意base= 0 exponent = 1, 那么直接返回 base exponent  为正为负 的情况 主要考察的点是将问题缩减,用折半的思想.这个题细节还是很多的,为了便于验证,leetcode上恰好有这个题,建议在线AC一下. def equal(self, a, b): return abs(a - b) <

剑指offer30题

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 看到这个 题目,第一想法就是,我要不定义一个变量,指向当前栈中最小的值,每次入栈,就和最小值进行比较,如果比最小值小,则最小值指向该值,否则最小值依旧. 但很快遇到问题,如果在出栈时,最小值出来后,比最小值小的值呢?无法查到了啊! 于是思路出来了,用一个辅助栈,第一次将入栈的值放入,接下来每一次,和栈顶的值进行比较,如果比它小,则将该值放入,否则把栈顶的值再次放入. 此题参考剑指offer书的思路. 下面附代码. packa

剑指offer 把字符串转化为整数

题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 思路:字符串转化为整数的方法num = num * 10 + str[i] - '0':特殊情况:1.输入字符串为NULL: 2.输入字符串只有+/-: 3.转化的数字大于最大值或小于

剑指offer系列10---数值的整数次方

[题目]给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. * [思路]主要是考虑幂的正负数以及等于0三种情况.但是在处理的时候要考虑细致,底数等于0时无意义,这时候应该报异常. 下面给出版本一: 1 package com.exe3.offer; 2 3 /** 4 * [题目]给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 5 * [思路]主要是考虑幂的正负数以及等于0

剑指Offer——把字符串转换成整数

题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0 分析: 只可能在最开始一位出现符号,所以我们特殊判断第一位,之后都得是数字字母,不然不合法. 代码: 1 class Solution { 2 public: 3 int StrTo

剑指offer 12:数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. public class Solution { public double Power(double base, int exponent) { boolean isNegtive = false; if(exponent == 0) return 1; if(exponent == 1) return base; if(exponent < 0){ isNegtive =

剑指offer 13:数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 保证base和exponent不同时为0 问题分析 计算一个浮点数的整数次方,主要考察的是对输入数据的完整性的预估能力.针对此问题,输入数据可能存在以下情况: 1.底数不为0,指数都为整数 2.底数不为0,指数都为负数 3.底数为0,指数为负数(出现零除情况) 4.底数为0,指数为正数(给定特殊值0或1) 代码实现的逻辑并不复杂,主要是需要考虑到所有可能存在的输入情况,同时需

剑指offer系列——12.数值的整数次方

Q:给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.保证base和exponent不同时为0. C:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M T: 1.刚刚学习了快速幂,正好用上:https://www.cnblogs.com/xym4869/p/12240806.html 这个题要注意,exponent可能为负. A: double Power(double base, int expo

剑指Offer对答如流系列 - 数值的整数次方

面试题15:数值的整数次方 题目描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 问题分析 三思而后行,这道题如果没事实现考虑好,非常容易出错. 首先分析列举出所有的场景. base的值 可能为正数也可能为负数(包含整数.小数) exponent的值可能为正整数也可能为负整数 base的值的处理是比较简单的,对于exponent的处理就要多加考虑了. 当exponent的值为负