项目终于告一段落了!很好,在元旦前准时提交客户.
不过,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级别的.
不知道大家有什么更好的解法,欢迎贴上来!
分享到:
相关推荐
易语言猜数字游戏是一款基于易语言编程环境开发的简单娱乐软件,主要目的是让用户通过猜测一个随机生成的数字来体验游戏的乐趣。在这个游戏中,系统会自动生成一个特定范围内的随机数,然后用户尝试猜测这个数字,...
- 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.:我还记得我...
假设):一个未经证实的信念或推测。 - assure(vt. 保证):使确信某事是真实的或会发生的。 - astonish(vt. 使惊讶):让人感到惊奇或震惊。 - athlete(n. 运动员):指参加体育比赛的专业人士。 - ...
### 消遣化辩论节目的利与弊 #### 正方观点:消遣化辩论节目是一种福 **核心论点**: 1. **理性思考与辩证思维的培养**:消遣化辩论节目能够吸引更广泛的观众群体,通过轻松有趣的形式传递辩论的核心精神,即理性...
1. **随机数生成**:游戏的核心是生成一个随机数,这通常通过调用C++标准库中的`<cstdlib>`或`<random>`头文件实现。在VC6.0环境下,可以使用`rand()`函数生成0到RAND_MAX之间的随机数,通过`srand(time(0))`设置...
这个简单的Java ORM框架,名为“Potato ORM”,可能是作者Li Hengming在业余时间创作的一个学习项目,用于消遣和教育目的。它具有极简的设计,包含的类数量不多,对于初学者来说,是理解ORM工作原理和实现方式的良好...
7. **It was unusual for a woman to live in the forest.** 对一个女人来说,在森林里生活是不寻常的。 8. **Her work changed the way people think about chimps.** 她的工作改变了人们对黑猩猩的看法。 9. **She...
本文档包含了一系列英语单词及其释义,涵盖了从基础词汇到较高级词汇的不同层面。通过学习这些词汇,考生可以提高自己的英语水平,尤其是在阅读理解、写作等方面的能力。 #### 词汇详解 - **abdomen** *n.*: 腹部...
【标题】2021年 第47次中国互联网络发展状况统计报告.pdf 【描述】2021年 第47次中国互联网络发展状况统计报告.pdf 高清完整版 该报告全面反映了中国互联网在2021年的整体发展情况,包括网络安全、用户规模、互联网...
在Windows CE环境下,这样的文件可能是一个.exe文件,用户可以通过解压并运行这个文件来在设备上玩微软纸牌游戏。 关于Windows CE 6.0的知识点: 1. **操作系统架构**:Windows CE是一个基于组件的、可裁剪的操作...
然而,《奇葩说》等消遣化辩论节目的出现改变了这一状况。这类节目通过网络平台播出,利用其广泛的传播力,成功地吸引了大量年轻观众的目光。节目中,辩手们以幽默风趣的语言风格和个性化的表达方式呈现辩论过程,...
3. **C++小游戏(1):大乱斗.txt**:这可能是一个文本文件,通常用于存储游戏的说明、开发者注释或额外的资源数据。在这种情况下,可能是开发者提供了关于游戏玩法的详细说明,或者记录了开发过程中的某些想法和设计...
【标题】"jiandaoshitoubu.zip_game" 指的是一个压缩包文件,其中包含了一个关于“剪刀石头布”(Rock-Paper-Scissors)的小游戏资源。这个小游戏可能是一个简单的互动程序,旨在唤起用户对童年时光的美好回忆。 ...
在这一单元中,我们重点关注以下几个核心知识点: 1. **动词amuse**: - `amuse sb. by/with sth.`:用某物使某人开心或娱乐。例如:`The teacher amused the children with a story.` - `amuse oneself by/with ...
1. 说明.doc:这可能是一个文档,详细介绍了游戏集合的使用方法、游戏规则或者安装步骤,对于用户来说,是了解和玩转这些游戏的重要参考。 2. 夜鹰行动.rar:这可能是一款以军事主题或潜行元素的游戏,"夜鹰"通常与...
【腾讯数字生活报告2019】揭示了数字技术如何深度渗透到人们的日常生活中,重构人际关系网络,并塑造个人发展路径。报告以马斯洛需求层次理论为基础,将数字时代个人需求分为生存、关系和发展三个层次。 1. **生存*...
游戏的目标是根据盘面上已经给出的部分数字,通过逻辑推理填充其余的空白格,确保每一行、每一列以及每一个宫格内的数字从1到9各出现一次且不重复。 ### 数独游戏的原理 #### 唯一性原理 数独游戏的基础原则之一...
10. 小说家(http://www.xsjia.com/):一个专门提供原创小说的平台,用户可以在这里找到众多作者的新作。 11. 79中文(http://www.79zw.com/)、80中文(http://www.80zw.com/)、86中文网(http://www.86zww.cn/...
从【压缩包子文件的文件名称列表】来看,只有一个名为"数钱数到手抽筋"的文件,这可能包含游戏的所有资源,如HTML文件(页面结构)、CSS文件(样式设计)、JavaScript文件(交互逻辑)、图像资源(游戏图形)等。...
2. 家长在孩子使用数字媒体时的角色:家长不应该禁止孩子使用计算机,而应该一起寻找其他的消遣方式,这涉及到了如何合理引导儿童使用数字媒体的策略。 3. 数字媒体的正面作用:虽然有时数字媒体的使用被认为是不好...