软件工程课堂练习——找出1-n中1出现的个数
2015-04-29 20:24
344 查看
题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。
在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
一、设计思想
通过归纳法,可以发现:
假设N = abcde,这里a,b,c,d,e分别是十进制数N的各个数位上的数字。如果要计算百位上出现1的次数,将受3方面因素影响:百位上的数字,百位以下(低位)的数字,百位(更高位)以上的数字。
如果百位上的数字为0,则可以知道百位上可能出现1的次数由更高位决定,比如12 013,则可以知道百位出现1的情况可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个。也就是由更高位数字(12) 决定,并且等于更高位数字(12)×当前位数(100)。
如果百位上的数字为1,则可以知道,百位上可能出现1的次数不仅受更高位影响,还受低位影响,也就是由更高位和低位共同决定。例如12 113, 受更高位影响,百位出现1的情况是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个,和上面第一种情况一样,等于更高位数字(12)×当前位数(100)。但它还受低位影响,百位出现1的情况是12 100-12 113,一共114个,等于低位数字(113)+1。
如果百位上数字大于1(即为2-9),则百位上可能出现1的次数也仅由更高位决定,比如12 213,则百位出现1的情况是:100-199,1 100-1 199,……,11 100-11 199,12 100-12 199,共1300个,并且等于更高位数字+1(12+1)×当前位数(100)。
二、源代码
三、运行结果截图
四、心得体会
这次练习的思想,和数学中的归纳法很像,俗话说就是找规律,通过列出不同情况,发现规律,从而得到了解决办法,这是一种由特殊到一般的思想。
要求:写一个函数 f(N) ,返回1 到 N 之间出现的 “1”的个数。例如 f(12) = 5。
在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少。
一、设计思想
通过归纳法,可以发现:
假设N = abcde,这里a,b,c,d,e分别是十进制数N的各个数位上的数字。如果要计算百位上出现1的次数,将受3方面因素影响:百位上的数字,百位以下(低位)的数字,百位(更高位)以上的数字。
如果百位上的数字为0,则可以知道百位上可能出现1的次数由更高位决定,比如12 013,则可以知道百位出现1的情况可能是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个。也就是由更高位数字(12) 决定,并且等于更高位数字(12)×当前位数(100)。
如果百位上的数字为1,则可以知道,百位上可能出现1的次数不仅受更高位影响,还受低位影响,也就是由更高位和低位共同决定。例如12 113, 受更高位影响,百位出现1的情况是100-199,1 100-1 199,……,11 100-11 199,一共有1 200个,和上面第一种情况一样,等于更高位数字(12)×当前位数(100)。但它还受低位影响,百位出现1的情况是12 100-12 113,一共114个,等于低位数字(113)+1。
如果百位上数字大于1(即为2-9),则百位上可能出现1的次数也仅由更高位决定,比如12 213,则百位出现1的情况是:100-199,1 100-1 199,……,11 100-11 199,12 100-12 199,共1300个,并且等于更高位数字+1(12+1)×当前位数(100)。
二、源代码
package com.java.lianxi; import java.util.Scanner; public class lianxi9 { public static void main(String[] args) { Scanner cin=new Scanner(System.in); System.out.print("请输入正整数的最大值:"); int n=cin.nextInt(); System.out.print("1的个数为:"+Sum1s(n)); } public static int Sum1s( int n ) { int iCount = 0; int iFactor = 1; int iLowerNum = 0; int iCurrNum = 0; int iHigherNum = 0; while( n / iFactor != 0 ) { iLowerNum = n - ( n / iFactor ) * iFactor; iCurrNum = (n / iFactor ) % 10; iHigherNum = n / ( iFactor *10 ); switch( iCurrNum ) { case 0: iCount += iHigherNum * iFactor; break; case 1: iCount += iHigherNum * iFactor + iLowerNum + 1; break; default: iCount += ( iHigherNum + 1 ) * iFactor; break; } iFactor *= 10; } return iCount; } }
三、运行结果截图
四、心得体会
这次练习的思想,和数学中的归纳法很像,俗话说就是找规律,通过列出不同情况,发现规律,从而得到了解决办法,这是一种由特殊到一般的思想。
相关文章推荐
- 软件工程课堂练习--找出“水王”
- 软件工程课堂练习--结对开发
- 课堂练习之找数字0-N中“1”出现的次数
- 软件工程个人作业4(课堂练习&&课堂作业)
- [每日练习]一个数组中有一个数字只出现一次,其他数字都出现了偶数次。请找出一个只出现一次的数字
- 软件工程课堂练习&课下作业
- 软件工程课堂练习2
- 软件工程--课堂练习之四则运算之续编
- 软件工程课堂练习--四则运算(三)
- 软件工程课堂练习 图书折扣问题
- 软件工程课堂练习-随机生成30道四则运算练习题
- 软件工程课堂练习--四则运算单元测试
- 软件工程课堂练习-最高折扣
- 课堂练习:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数。
- 软件工程课堂练习——求买书最低价格
- 软件工程课堂练习找水王
- 软件工程课堂练习--找“一”
- 软件工程课堂练习:返回一个一维整数数组中最大子数组的和
- 软件工程课堂练习--结对初体验
- 软件工程课堂练习找水王续