/*************************************************************************
> 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的个数的更多相关文章

  1. 剑指 Offer 43. 1~n 整数中 1 出现的次数 + 数位模拟 + 思维

    剑指 Offer 43. 1-n 整数中 1 出现的次数 Offer_43 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author ...

  2. 剑指Offer30——包含min函数的栈

    剑指Offer30--包含min函数的栈 1. 题目简述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min.push及pop的时间复杂度是O(1). 2. 题 ...

  3. 剑指Offer - 九度1513 - 二进制中1的个数

    剑指Offer - 九度1513 - 二进制中1的个数2013-11-29 23:35 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. ...

  4. 剑指offer-面试题11.数值的整数次方

    题目:实现函数double Power(double base,int exponent),求base的 exponent次方.不得使用库函数,同时不需要考虑大数的问题. 这道题看似很简单: 然而需要 ...

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

    题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法 ...

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

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. public class Solution { public double P ...

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

    题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0   输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果 ...

  8. 剑指offer--30.二叉搜索树的后序遍历序列

    正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...

  9. 剑指offer--15.把字符串转换成整数

    stringstream做这个真的很舒服 ------------------------------------------------------------------------------- ...

随机推荐

  1. 函数WideCharToMultiByte() 详解

    函数原型: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPWSTR lpWideCharStr, int cchWideChar, ...

  2. (剑指Offer)面试题15:链表中倒数第k个结点

    题目: 输入一个链表,输出该链表中倒数第k个结点. 例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4. 链表结点定义: struct ListNode{ in ...

  3. 3DTouch-ShortcutItem - iOS9 - xcode7

    据说苹果某个神秘的团队闭门潜心研发多年的3DTouch终于,应用在iOS9上,且公开了API. 在系统主界面用力按压 APP 图标,如上会出现自定义菜单 有两种方法可以实现一.代码(这种方法也是可以动 ...

  4. 一个jQuery扩展工具包

    带有详尽注释的源代码: var jQuery = jQuery || {}; // TODO // ###################################string操作相关函数### ...

  5. [MySQL复制异常]'Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT = STATEMENT.'

    MySQL复制错误]Last_Errno: 1666 Last_Error: Error executing row event: 'Cannot execute statement: imposs ...

  6. URL是什么?

    URL是统一资源定位符,有时也被俗称为网页地址. 如同在网络上的门牌,是因特网上标准的资源的地址(Address). 在因特网的历史上,统一资源定位符的发明是一个非常基础的步骤.统一资源定位符的语法是 ...

  7. org.apache.catalina.mbeans.ServerLifecycleListener

    Tomcat 启动报错: java.lang.ClassNotFoundException: org.apache.catalina.mbeans.ServerLifecycleListener at ...

  8. Android 图像压缩,和LRU算法使用的推荐链接

    近两日,看的关于这些方面的一些教程数十篇,最好的当属google原版的教程了.国内有不少文章是翻译这个链接的. 需要注意的一点是:Android的SDK中的LRU算法在V4包和Util包中各有一个,推 ...

  9. iOS开发——高级UI之OC篇&UIdatePicker&UIPickerView简单使用

    UIdatePicker&UIPickerView简单使用 /***************************************************************** ...

  10. error C2440:“类型转换":无法从“void (__thiscall Play1::* )(int *)”转换为“cocos2d::SEL_CallFucN

    转自:http://zhidao.baidu.com/link?url=VfSSkA0xfTVwNKaKh4tqW_sXlcsK-Rb16nEtQw5zaq5_306lnwJN3Kdb-rFp-r4L ...