`
rappy
  • 浏览: 43704 次
  • 性别: Icon_minigender_1
  • 来自: 天涯海角
文章分类
社区版块
存档分类
最新评论

闲来消遣之一:任给一个自然数,统计从0开始数到这个数时1的出现次数.

阅读更多
   项目终于告一段落了!很好,在元旦前准时提交客户.
   不过,30号,我们还是忙到了31号凌晨.感觉经理挺负责任的.虽然大家为了赶项目,忙了一周,都身心俱累,但我们还是坚持下来了,没有任何怨言,只有解决问题后的那份欢愉.
   可以安心回家过个假期了.
   元旦放假回家闲得慌(汗,我就是劳苦命,闲不住!),刚好本本带回家,就开起来,练练手.
   想起先前在某个群里有人说起一个题目,感觉挺有意思的.由于先前项目赶,一直没有多余的心思想其它的,渐渐的忘了.正好现在想起来,真好!
  
   题目:任给一个自然数,包括0,统计从0开始数到这个数,1的出现次数.
   这个题目的解法有n多.相信很多人看了,可以列出一大摞的解决方法出来.
   我这边就说下我的思路.
   我打算按个,十,百位...这样来统计.
   比如给个数2000.
   那在千位上有1的数是1000-1999,总共1000个.
   在百位上有1的数是100-199,1100-1199,总共200个.
   在十位上有1的数是10-19,110-119,...,1910-1919总共200个.
   在个位上有1的数是1,11,21,...,1991,总共200个.
   这样一来就可以统计出一个规律了.
   对于数m--常量, n(1,10,100,...)位上1的个数k(n)=m/(10*n)*n
   这里假设m都是可以被n整除的
    要做到上面的条件,可以对m进行拆分(分治策略)
   比如2345就可以拆成2000+300+40+5,这样每个拆分的数都可以用上面的函数来统计,最后结果加起来就是了.
   代码如下(JAVA实现).
 /**
	 * 计算从1数到n的过程中1的出现次数.
	 * 
	 * @param n
	 * @return
	 */
	public long getNumbersOfOne(long n) {
		long amount = 0;
		int t = 0;
		int i = 1;
		int x = 0;
		for (; (t = new Double(n / Math.pow(10, i)).intValue()) > 0; i++) {
			// 除数
			x = new Double(Math.pow(10, i - 1)).intValue();
			amount += t * x;
			// 余数
			amount = countRemind(n, amount, i, x);
		}
		x = new Double(Math.pow(10, i - 1)).intValue();
		// 余数
		amount = countRemind(n, amount, i, x);

		return amount;
	}

	/**
	 * 计算余数中该位上1的出现次数.
	 * 
	 * @param n
	 * @param amount
	 * @param i
	 * @param x
	 * @return
	 */
	private long countRemind(long n, long amount, int i, int x) {
		int k = new Double(n % Math.pow(10, i)).intValue();
		int m = BASE * x - 1;
		if (m == 0) {
			// 个位的
			if (k >= 1)
				amount += 1;
		} else {
			int num = k - m;
			if (num >= x)
				amount += x;
			else if (num >= 0)
				amount += num;
		}
		return amount;
	}

该算法复杂度是logN级别的.
不知道大家有什么更好的解法,欢迎贴上来!
分享到:
评论

相关推荐

    易语言猜数字游戏

    易语言猜数字游戏是一款基于易语言编程环境开发的简单娱乐软件,主要目的是让用户通过猜测一个随机生成的数字来体验游戏的乐趣。在这个游戏中,系统会自动生成一个特定范围内的随机数,然后用户尝试猜测这个数字,...

    (中小学教育)一定能够用的到的十九种功能句型.docx

    - It’s a 3-room apartment, and it’s about 80 square meters.:这是一个三居室的公寓,大约80平方米。 5. 回忆过去: - I can still remember the time when I passed my entrance examinations.:我还记得我...

    新东方新四级词汇-正序版.pdf

    假设):一个未经证实的信念或推测。 - assure(vt. 保证):使确信某事是真实的或会发生的。 - astonish(vt. 使惊讶):让人感到惊奇或震惊。 - athlete(n. 运动员):指参加体育比赛的专业人士。 - ...

    消遣化辩论节目是福是祸教程文件.docx

    ### 消遣化辩论节目的利与弊 #### 正方观点:消遣化辩论节目是一种福 **核心论点**: 1. **理性思考与辩证思维的培养**:消遣化辩论节目能够吸引更广泛的观众群体,通过轻松有趣的形式传递辩论的核心精神,即理性...

    猜数字游戏(VC6.0_MFC)

    1. **随机数生成**:游戏的核心是生成一个随机数,这通常通过调用C++标准库中的`<cstdlib>`或`<random>`头文件实现。在VC6.0环境下,可以使用`rand()`函数生成0到RAND_MAX之间的随机数,通过`srand(time(0))`设置...

    一个简单的JavaORM框架寂寞消遣之作可供学习参考只有几百行代码。

    这个简单的Java ORM框架,名为“Potato ORM”,可能是作者Li Hengming在业余时间创作的一个学习项目,用于消遣和教育目的。它具有极简的设计,包含的类数量不多,对于初学者来说,是理解ORM工作原理和实现方式的良好...

    高中英语必修4重点词汇,短语,句子复习总结.pdf

    7. **It was unusual for a woman to live in the forest.** 对一个女人来说,在森林里生活是不寻常的。 8. **Her work changed the way people think about chimps.** 她的工作改变了人们对黑猩猩的看法。 9. **She...

    考研英语最新大钢词汇.2010考研适用.pdf

    本文档包含了一系列英语单词及其释义,涵盖了从基础词汇到较高级词汇的不同层面。通过学习这些词汇,考生可以提高自己的英语水平,尤其是在阅读理解、写作等方面的能力。 #### 词汇详解 - **abdomen** *n.*: 腹部...

    2021年 第47次中国互联网络发展状况统计报告.pdf

    【标题】2021年 第47次中国互联网络发展状况统计报告.pdf 【描述】2021年 第47次中国互联网络发展状况统计报告.pdf 高清完整版 该报告全面反映了中国互联网在2021年的整体发展情况,包括网络安全、用户规模、互联网...

    windowsjdzp_liqucn.com.zip

    在Windows CE环境下,这样的文件可能是一个.exe文件,用户可以通过解压并运行这个文件来在设备上玩微软纸牌游戏。 关于Windows CE 6.0的知识点: 1. **操作系统架构**:Windows CE是一个基于组件的、可裁剪的操作...

    消遣化辩论节目是辩论之福3.docx

    然而,《奇葩说》等消遣化辩论节目的出现改变了这一状况。这类节目通过网络平台播出,利用其广泛的传播力,成功地吸引了大量年轻观众的目光。节目中,辩手们以幽默风趣的语言风格和个性化的表达方式呈现辩论过程,...

    C++小游戏(1):大乱斗.rar

    3. **C++小游戏(1):大乱斗.txt**:这可能是一个文本文件,通常用于存储游戏的说明、开发者注释或额外的资源数据。在这种情况下,可能是开发者提供了关于游戏玩法的详细说明,或者记录了开发过程中的某些想法和设计...

    jiandaoshitoubu.zip_game

    【标题】"jiandaoshitoubu.zip_game" 指的是一个压缩包文件,其中包含了一个关于“剪刀石头布”(Rock-Paper-Scissors)的小游戏资源。这个小游戏可能是一个简单的互动程序,旨在唤起用户对童年时光的美好回忆。 ...

    【北师大版】(安徽专用)2012届高三英语一轮复习精品学案:M6 Unit 17 Laughter.doc

    在这一单元中,我们重点关注以下几个核心知识点: 1. **动词amuse**: - `amuse sb. by/with sth.`:用某物使某人开心或娱乐。例如:`The teacher amused the children with a story.` - `amuse oneself by/with ...

    80个安卓小游戏b.7z

    1. 说明.doc:这可能是一个文档,详细介绍了游戏集合的使用方法、游戏规则或者安装步骤,对于用户来说,是了解和玩转这些游戏的重要参考。 2. 夜鹰行动.rar:这可能是一款以军事主题或潜行元素的游戏,"夜鹰"通常与...

    腾讯数字生活报告2019.pdf

    【腾讯数字生活报告2019】揭示了数字技术如何深度渗透到人们的日常生活中,重构人际关系网络,并塑造个人发展路径。报告以马斯洛需求层次理论为基础,将数字时代个人需求分为生存、关系和发展三个层次。 1. **生存*...

    数独游戏概述、原理及应用.pdf

    游戏的目标是根据盘面上已经给出的部分数字,通过逻辑推理填充其余的空白格,确保每一行、每一列以及每一个宫格内的数字从1到9各出现一次且不重复。 ### 数独游戏的原理 #### 唯一性原理 数独游戏的基础原则之一...

    电子书下载网址大全.pdf

    10. 小说家(http://www.xsjia.com/):一个专门提供原创小说的平台,用户可以在这里找到众多作者的新作。 11. 79中文(http://www.79zw.com/)、80中文(http://www.80zw.com/)、86中文网(http://www.86zww.cn/...

    H5微信小游戏源码-数钱数到手抽筋.zip

    从【压缩包子文件的文件名称列表】来看,只有一个名为"数钱数到手抽筋"的文件,这可能包含游戏的所有资源,如HTML文件(页面结构)、CSS文件(样式设计)、JavaScript文件(交互逻辑)、图像资源(游戏图形)等。...

    云南省玉溪市高三德语上学期第一次月考试题.pdf

    2. 家长在孩子使用数字媒体时的角色:家长不应该禁止孩子使用计算机,而应该一起寻找其他的消遣方式,这涉及到了如何合理引导儿童使用数字媒体的策略。 3. 数字媒体的正面作用:虽然有时数字媒体的使用被认为是不好...

Global site tag (gtag.js) - Google Analytics