Jun 17, 2009
统计从1至400亿之间的自然数中含有多少个1?比如1-11中,有1,10,11这三个自然数有4个1。
拿到这道题目,您会如何去计算呢?如果是计算机方面的面试,你又该如何去思考呢?也有同事拿这道题目谈到了“数学”与“数感”的理解,不过笔者却想谈一些更实际一些东西。
如果是计算机方面的出现这道题目,我们可能首先想到的是挨个去找。比如1含有一个1,然后2不含有1,…10含有1个1, 11含有2个1,….直到4亿。实际去想想,可能还有第二种方法,即对于每一个数字,转换成一个字符串,然后查里面的1,这或许处理的时候简单一些,但思路基本一致。
方法二:对于每一个数字,首先转换成字符串,然后查询里面的1的个数,然后求合。这实际上没有实质的进步,无论计算复杂度还是难度,都没有质的简化。实际上如果仔细观察的话,我们会发现给出的一个有效数字是4亿,也意味着除了最高位是4位,其它全是0,那么由此可以知道它的位数是9位以内的,如果是9位,最高位只可能是1、2、3。有了这些信息我们就可以进一步分析了。
如果数字为9位,那么最高位只可能是1, 2, 3。如果最高位是1,那么剩余的8位可能含有1-8个1。因此进行分类分析。
剩余8位含有1个1的情况:2 * C(8, 1) * P(7, 7)。
剩余8位含有2个1的情况:3 * C(8, 2) * P(6, 6)。
….
然后将上面的值进行求合。
最高位是2, 3则可以进行类似计算,实际注意一下规范,可以利用上面的结果的。
我们再考虑一下其它情况,即含有1 - 8位的情况。我们假设含有N位,以此来进行说明。
最高位可能是1, 也可能是2-9,位不可能是0。因此可以利用上面类似的算法。
S(N) = 2 * C(N-1, 1) + 3 * C(N-1, 2) …. + (N-1) * C(N-1, N-1) + 8*(1 * C(N-1, 1) + [...]
Jun 17, 2009
前些天看到世界javascript程序员有所增加,因此想着也凑凑热闹。看了一些基本的语法,写了些简单的小程序,还挺好使。但是后来也遇到一些问题,比如想写个简单的五子棋的游戏,想画一些数学公式的曲线,并没有找到现呈的东西可使。找了一些javascript的UI设计的东东,自已封装了了个最简单的画线的UI,下面介绍一下。
//zjaUI.js
/**************************************************************
* this is write by zhangjiuan
*************************************************************/
var zjaUI = {
//ui line color
color: ‘#000′,
/**
* set color
**/
setColor: function(color)
{
this.color = color;
},
/**
* draw line dot
* but we may not need draw line dot and dot,
* becourse if x = 0, and y …, so we can [...]
Jun 17, 2009
昨天自已也因为cvs的版本控制困惑了几个小时,查阅了相关资料,最终获得了自已想要的结果。实际整个流程梳理一下,很简单,不过对于当时不知道的情况下,就是一个很麻烦的事情了。现在以BLOG的形式记录如下,希望自已以后不再犯这样的困惑,也希望能给阅读了此篇文章的朋友有一点帮助。
背景:因为项目的并行开发,在主干上打了一个分枝作为其它项目的开发基线。现在主干已经上线,分枝也开发完毕。因此想将主干上的代码合并到分枝中来,以达到在上线的时候不复盖主干的代码的目的。
过程:查阅了相关的资料,有如下几个相关函数。cvs update -j(合并)cvs update -r (更新到某个版本) cvs tag -b (加某一分枝) cvs log 查看相关cvs log信息 cvs status当前版本状态。
为了便于说明与不涉及相关工作信息,下面以main代表主干,以branch代表分枝。首先在主干上打了main tag,命令如下:cvs tag main,添加一个test.txt,修改文件:
cat test.txt
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbb
ccccccccccccccccc
然后在这里打上分枝的tag,命令如下:cvs tag -b branch,现在修改test.txt文件:
cat test.txt
aaaaaaaaaaaaaaaaa
bbbbbbddddddddddd
ccccccccccccccccc
这样以保证主干和分枝是有充突的。
好下一步应该是合并了。操作命令如下:cvs tag -j main。结果不是想要的结果,并没有任何冲突,为什么呢?由此自已经过仔细思考和查阅相关资料,实现虽然打了分枝的tag,但实际并没有切到分枝,因此修改的仍旧在主干上。
为此做如下测试:
cvs tag mian; cvs status,可以看出是在主干上。cvs tag -b branch; cvs status,此时虽说打了分枝,但并没有切到分枝上,实际仍然在主干上开发。因此上面并不会充突。实际切到分枝也是很简单的。
cvs update -r branch,好了,此时再cvs update -j main,终于看到了可爱的<<<<<<<<<<<, >>>>>>>>>>>>冲突信息了。
多谢
张久安
If you enjoyed [...]