在从1 到n 的正数中1 出现的次数
2014-04-19 13:57
134 查看
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。
例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。
分析:这是一道广为流传的google面试题。
简单的方法就是按照给位进行分析
在个位出现1的个数=n/10+(个位=0,0;个位>1,1;个位=1,低0位+1);
十位位出现1的个数=n/100*10+(十位=0,0;十位>1,10,;十位=1,低一位+1);
百位出现1的个数=n/1000*100+(百位=0,0;百位>1,100;百位=1,低两位+1);
等等
算法的复杂度仅仅和位数有关
算法描述:
(1)求出所给正整数a的位数,假设为N,num保存1的个数
(2)另p=a,num+=p/10i*10i-1;(i=1...N-1);
(3)令p=a/10i-1;p=p%10,if(p==1) num+=a%10i-1+1;if(p>1) num+=10i-1;(i=1....N)
(4)printf(num);
手工求解:
125
个位=12+1
十位=10+10
百位=0+26
59个1
算法:
结果输出为 45679
例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。
分析:这是一道广为流传的google面试题。
简单的方法就是按照给位进行分析
在个位出现1的个数=n/10+(个位=0,0;个位>1,1;个位=1,低0位+1);
十位位出现1的个数=n/100*10+(十位=0,0;十位>1,10,;十位=1,低一位+1);
百位出现1的个数=n/1000*100+(百位=0,0;百位>1,100;百位=1,低两位+1);
等等
算法的复杂度仅仅和位数有关
算法描述:
(1)求出所给正整数a的位数,假设为N,num保存1的个数
(2)另p=a,num+=p/10i*10i-1;(i=1...N-1);
(3)令p=a/10i-1;p=p%10,if(p==1) num+=a%10i-1+1;if(p>1) num+=10i-1;(i=1....N)
(4)printf(num);
手工求解:
125
个位=12+1
十位=10+10
百位=0+26
59个1
算法:
#include <stdio.h> int test(int a){ int i; int num=1; if(a==0) return 1; for(i=1;i<=a;i++) num*=10; return num; } int function(int a){ int p=a; int num=0; int N=0; int temp; int i; while(p!=0) { p=p/10; N++; } p=a; for(i=1;i<=N;i++){ num+=p/test(i)*test(i-1); temp=a/test(i-1)%10; if(temp==1) num+=a%test(i-1)+1; if(temp>1) num+=test(i-1); } return num; } void main(){ printf("%d\n",function(88888)); }
结果输出为 45679
相关文章推荐
- 去掉Win7资源管理器左侧不需要的项目
- 我的嵌入式Qt开发第一课——基于BBB和hmc5843三轴电子罗盘
- 本贾尼-斯特劳斯特卢普(Bjarne Stroustrup)1950年出生于丹麦
- sphinx配置文件
- alignof/alignas
- flash文件运动节奏的控制。
- 枚举实现
- AsyncTask异步二
- Jquery的DOM操作
- 为什么erlang比C“慢”?
- Jquery的选择器
- [翻译]你不会想知道的kobject,kset,和ktypes
- thinking in java Generics Latent typing
- 基础正则表达式的用法
- 实用工具类 && CollectionUtils
- 多个Button监听
- 珍爱生命,远离“匿名”应用
- 深入理解Lua的全局变量_G以及源码实现
- linux下getsockopt和setsockopt详解及测试
- Hbase shell 命令详解