【算法总结-数学】求1-N中1出现的次数
来源:互联网 发布:dokidokilive直播软件 编辑:程序博客网 时间:2024/06/11 23:01
【编程之美】给定一个十进制正整数N,求出从1开始,到N的所有整数,数字1出现的次数。
例如,N=2,则两个数为1,2 。数字1出现的个数是1.
又如n = 20.则20个数中1出现的为:1,10,11,12,13,14,。。。19 共有12个。
设计一个算法,可以高效地求出1-N之间出现的1的个数。(主要考虑效率)。
记录:
对于一个数abcde。出现1的次数可以通过计算各位中出现的1的个数的和计算出来。以统计10位上1的个数为例,记icurrnum为当前要统计的位(例如10位上)的值(d),ilow为icurrnum低位的值(e),ihighnum为icurrnum高位的值(abc).
则根据icurr的值,出现1的个数可以归纳为:
i . icurrnum == 0; 则10位上出现1的次数由更高位的abc决定,且次数等于ihighnum * 10;
ii .icurrnum == 1;则10位上出现1的次数由高位和低位共同决定,次数等于 ihighnum*10 + ilownum+1
iii icurrnum >1, 则10位上1的次数由高位决定,且次数等于(ihigh+1) *10;
一次计算个位,10位,百位。。。等出现1的个数,相加,就是最终的结果。
编码【改自编程之美P135】
#include <stdio.h>int sum(int n){ int icount = 0; int ifactor = 1; int ilowernum = 0; int icurrnum = 0; int ihighnum = 0; while(n/ifactor != 0){ ilowernum = n-(n/ifactor)*ifactor; icurrnum = (n/ifactor)%10; ihighnum = n/(ifactor*10); switch(icurrnum){ case 0:icount +=ihighnum*ifactor;break; case 1:icount +=ihighnum*ifactor+ilowernum+1;break; default:icount +=(ihighnum + 1) * ifactor;break; } ifactor *=10; } return icount;}main(){ int n; while(true){ scanf("%d",&n); printf("the count of 1 is :%d\n",sum(n)); } return 0;}
如果数字过大,用long long 类型替代int.
- 【算法总结-数学】求1-N中1出现的次数
- 求从1到n整数中1出现的次数:O(logn)算法
- 求1-n中数字1出现的次数
- 求整数1..N中1出现的次数
- 求1-n中数字出现的次数
- 求1~n中0~9出现的次数
- 整数中1出现的次数(从1到n整数中1出现的次数)--数学规律法
- 求1到n这n个整数的十进制表示中1出现的次数
- 算法 求数字1出现的次数
- 算法题求解:从1~N中求某个字符出现次数
- 每天学习一算法系列(28)(输入一个整数n,求从1 到n 这n 个整数的十进制表示中1 出现的次数)
- 经典算法: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数
- 1-n中1出现的次数
- N个数中,1出现的次数
- 整数中1出现的次数(从1到n整数中1出现的次数)(算法)
- 1到n求1出现的 次数
- 求1-n直接1出现的次数
- 求1-n中的某个数的出现次数
- 怎样将BizTalk服务器应用程序和Service Bus Queues 和 Topics整合起来
- sys.wrh$_active_session_history v$active_session_history
- open和fopen的区别:
- Myeclipse8.5中svn插件安装方法
- 怎样在后台找到前台的table空间并设置table中单元格是否显示
- 【算法总结-数学】求1-N中1出现的次数
- unity3d中让某个物体透明
- 虚函数、虚表原理
- FACEBOOK的实时HADOOP系统
- 值类型和引用类型
- win7 调成保护眼睛的颜色
- Java 链表
- GDB命令大全
- 后缀树(Suffix Tree) 应用