<编程之美>2.4 1的数目的解释
2015-11-20 21:42
197 查看
题目:给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。
以下我自己一点理解,希望能帮到大家,有什么不对的请大家指出来。其实最重的是这种思路,把一个复杂的大问题,经分析,划分成小问题,依次解决。不过真的很难做到,慢慢努力吧。
书中第二解法的解释
按书中说法:
假设abcd是个4位数,求其中1—abcd中出现1的个数。把问题划分成求个位、十位、百位、千位出现1的次数,最后求和。
书中拿百位举例。我也用百位举例,求百位出现1的次数。
百位把数字分成三部分:a, b, cd。a是高位值,b是当前位值,cd是低位值。
b有三种情况:
(1)b=0:这种情况,百位出现1至于高位相关。100--199, 1100--1199 ,------- (a-1)100--(a-1)199 有a*100。
(2)b=1:这种情况,其实就是在b=0的基础上,加上 a100--a1cd cd+1个1, 既a*100+cd+1。
(3)b>1:这种情况,b=0的基础上加上 a100---a199 100个1,既(a+1)*100。
其他位依次如此操作即可。
假设n是所给数字,
个位:高位值=n/(1*10) , 当前位值=n/(1)%10, 低位值=n-(n/1)*1 factor = 1
十位:高位值=n/(10*10) , 当前位值=n/(10)%10, 低位值=n-(n/10)*10
factor = 10
百位:高位值=n/(100*10) , 当前位值=n/(100)%10, 低位值=n-(n/100)*100 factor
= 100
对任意位,factor为对应数值(1,10,100.....)
高位值=n/(factor*10)
, 当前位值=n/(factor)%10, 低位值=n-(n/factor)*factor
这样就可以写出代码:
public static int reserch2(int a) {
int n = 0;
int low = 0;
int hight = 0;
int current = 0;
int factor = 1;
while (a / factor != 0) {
low = a - (a / factor) * factor;
hight = a / (factor * 10);
current = (a / factor) % 10;
switch (current) {
case 0:
n += hight * factor;
break;
case 1:
n += hight * factor + low + 1;
break;
default:
n += (hight + 1) * factor;
break;
}
factor*=10;
}
return n;
}
以下我自己一点理解,希望能帮到大家,有什么不对的请大家指出来。其实最重的是这种思路,把一个复杂的大问题,经分析,划分成小问题,依次解决。不过真的很难做到,慢慢努力吧。
书中第二解法的解释
按书中说法:
假设abcd是个4位数,求其中1—abcd中出现1的个数。把问题划分成求个位、十位、百位、千位出现1的次数,最后求和。
书中拿百位举例。我也用百位举例,求百位出现1的次数。
百位把数字分成三部分:a, b, cd。a是高位值,b是当前位值,cd是低位值。
b有三种情况:
(1)b=0:这种情况,百位出现1至于高位相关。100--199, 1100--1199 ,------- (a-1)100--(a-1)199 有a*100。
(2)b=1:这种情况,其实就是在b=0的基础上,加上 a100--a1cd cd+1个1, 既a*100+cd+1。
(3)b>1:这种情况,b=0的基础上加上 a100---a199 100个1,既(a+1)*100。
其他位依次如此操作即可。
假设n是所给数字,
个位:高位值=n/(1*10) , 当前位值=n/(1)%10, 低位值=n-(n/1)*1 factor = 1
十位:高位值=n/(10*10) , 当前位值=n/(10)%10, 低位值=n-(n/10)*10
factor = 10
百位:高位值=n/(100*10) , 当前位值=n/(100)%10, 低位值=n-(n/100)*100 factor
= 100
对任意位,factor为对应数值(1,10,100.....)
高位值=n/(factor*10)
, 当前位值=n/(factor)%10, 低位值=n-(n/factor)*factor
这样就可以写出代码:
public static int reserch2(int a) {
int n = 0;
int low = 0;
int hight = 0;
int current = 0;
int factor = 1;
while (a / factor != 0) {
low = a - (a / factor) * factor;
hight = a / (factor * 10);
current = (a / factor) % 10;
switch (current) {
case 0:
n += hight * factor;
break;
case 1:
n += hight * factor + low + 1;
break;
default:
n += (hight + 1) * factor;
break;
}
factor*=10;
}
return n;
}
相关文章推荐
- 官方的PSNR和SSIM代码
- Google推荐的图片加载库Glide介绍
- 一步一步制作yaffs/yaffs2根文件系统(一)---储备好基础知识再打
- 《C++ primer》英文第五版阅读笔记(十四)——算术运算符
- ASP.NET-MVC4-05-Views
- python初级了解
- 【java】匿名内部类
- java是值传递还是引用传递?
- Java中==与equals的区别(可以试下重写hashcode与equals方法)
- Python基础内容四
- 对java中异常的学习
- 使用Myeclipse10建立WebService工程的配置详解(附例程)
- Matlab中uigetfile命令的应用
- Java中的栈和堆
- 【java】内存分析
- C++设计模式::装饰模式or代理模式or面向切片编程(AOP)
- Java JDBC 驱动 MySQL
- Asp.net MVC 中使用 Ninject 实现依赖注入
- LUA的堆栈设置?未完。。。以后再写
- PHP设计模式之单例模式