【编程之美】2.4从1到N中1出现的数目----出现任意一个数的个数。
2015-04-19 22:07
337 查看
题目描述:
给定一个十进制整数N,写出从1开始到N的所有整数,统计一下其中出现所有“1”的个数。
例如12,一共有1、10、11、12四个数中出现5次1。
问:
1、写出一个函数,返回1到N之间出现1的次数
2、满足条件f(N) = N 的最大的N是多少。
题目解析:
思路一:
我们用粗暴的方式,要求1的个数,那么我们就跟二进制中统计1的个数一样,我们从1->N遍历,对每一个数对10求余,判断是否为1,然后再除以10,不断循环。时间复杂度为O(NlgN)。
思路二:
当我们分析这个题目的时候,会发现个位十位百位等出现1的数目是有规律的,毕竟对于个位说增加10会有又一次循环。
我们还是考虑比较通用的,也更方便我们分析,将题目换成:出现3的次数。对于456和314我们同时讨论:[/u]
(1)先判断百位的4,由于4比3大,那么会有300-399,百位出现了3的次数为100。再考虑314的百位3,由于跟3相等,估百位出现3的次数为(14+1)。因为300也要算。
(2)再考察一下十位的5,由于5比3大,那么会有30-39,130-139,230-239,330-339,430-439一共50个数据,也就是说当十位大于3的时候出现的个数为(百位数+1)*10。再看看314,有30-39,130-139,230-239一共三十个数据,也就是说当十位小于3的时候,为——百位数*10
,这时就不需要再加1了。但如果为332呢?也就是十位等于3时,十位出现的个数为(百位数*10 +个位数+1)
(3)分析个位的话,与十位相同。
总结:
N = abcde 对于百位来说受到三个方面的影响,更高位,百位,低位三者的影响:
1、c为0时,百位出现1的次数为(ab)* 100。
2、c为1时,百位出现1的次数为(ab)* 100 + de + 1
3、c大于1时,百位出现1的次数为(ab+1)* 100
ULONGLONG lower,current,higher; while(n/factor != 0)
给定一个十进制整数N,写出从1开始到N的所有整数,统计一下其中出现所有“1”的个数。
例如12,一共有1、10、11、12四个数中出现5次1。
问:
1、写出一个函数,返回1到N之间出现1的次数
2、满足条件f(N) = N 的最大的N是多少。
题目解析:
思路一:
我们用粗暴的方式,要求1的个数,那么我们就跟二进制中统计1的个数一样,我们从1->N遍历,对每一个数对10求余,判断是否为1,然后再除以10,不断循环。时间复杂度为O(NlgN)。
int CountOne(int n) { int num = 0; int v; for(int i = 1;i <= n;++i)
{ v = i; while(v)
{ if(v%10 == 1) num++; v /= 10; } } return num; }
思路二:
当我们分析这个题目的时候,会发现个位十位百位等出现1的数目是有规律的,毕竟对于个位说增加10会有又一次循环。
我们还是考虑比较通用的,也更方便我们分析,将题目换成:出现3的次数。对于456和314我们同时讨论:[/u]
(1)先判断百位的4,由于4比3大,那么会有300-399,百位出现了3的次数为100。再考虑314的百位3,由于跟3相等,估百位出现3的次数为(14+1)。因为300也要算。
(2)再考察一下十位的5,由于5比3大,那么会有30-39,130-139,230-239,330-339,430-439一共50个数据,也就是说当十位大于3的时候出现的个数为(百位数+1)*10。再看看314,有30-39,130-139,230-239一共三十个数据,也就是说当十位小于3的时候,为——百位数*10
,这时就不需要再加1了。但如果为332呢?也就是十位等于3时,十位出现的个数为(百位数*10 +个位数+1)
(3)分析个位的话,与十位相同。
总结:
N = abcde 对于百位来说受到三个方面的影响,更高位,百位,低位三者的影响:
1、c为0时,百位出现1的次数为(ab)* 100。
2、c为1时,百位出现1的次数为(ab)* 100 + de + 1
3、c大于1时,百位出现1的次数为(ab+1)* 100
LONGLONG Sum1s(ULONGLONG n) { <pre code_snippet_id="407179" snippet_file_name="blog_20140626_2_7215278" name="code" class="cpp" style="font-size: 16px; line-height: 25px; color: rgb(51, 51, 51); border: 1px solid rgb(255, 255, 204); border-image-source: initial; border-image-slice: initial; border-image-width: initial; border-image-outset: initial; border-image-repeat: initial; font-family: 'Courier New'; overflow: auto; background-color: rgb(255, 255, 252);"> ULONGLONG count = 0;ULONGLONG factor = 1;
ULONGLONG lower,current,higher; while(n/factor != 0)
{//取出多位数中某一位lowerNum,其左边higherNum,右边数据lowerNum lowerNum = n - (n/factor)*factor;//或者lowerNum=n%factor; currentNum = (n/factor)%10; higherNum = n/factor/10; switch(current)//判断当前位和1的关系。
{ case 0://当前位比1小 count += higherNum * factor; break; case 1: count += higherNum * factor + lowerNum + 1; break; default ://当前位比1大 count += (higherNum + 1)*factor; break; } factor *= 10; } return count; }
相关文章推荐
- 【编程之美】2.4从1到N中1出现的数目
- 12、一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
- c#编程:任意输入星期几的一个字母来判断一下是星期几
- 编程之美 2.4 1的数目
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- ListView显示列表,双击ListView里任意一行信息,出现一个可以修改的窗口
- 5.8.从键盘任意输入一个字符,编程判断该字符是数字字符、大写字母、小写字母、空格还是其他字符。
- JavaScript编程--任意输入一个数判断是不是闰年,数列求和练习
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现
- 编程之美-2.4 1的数目
- 给定任意一个字符串,使用 for in 语句来统计字符出现的个数
- Hadoop编程入门,统计单词出现数目wordcount
- (使用STL中的数据结构进行编程7.3.15)UVA 630 Anagrams (II)(求一个单词在字典中出现的次数)
- 编程之美--2.4 1的数目之扩展问题
- 5.1 从键盘任意输入一个实数,不使用计算绝对值函数编程计算并输出该实数的绝对值
- 集体智慧编程笔记——sqlite中出现的一个小问题
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字,编程实现。
- 读书笔记之编程之美 - 2.4 1的数目
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。