代码改变世界

编程之美 不要被阶乘吓倒

2013-08-22 23:41 by youxin, 755 阅读, 0 推荐, 收藏,
摘要:问题描述:1. 给定一个整数N,那么N的阶乘N!末尾有几个0?2. 求N!的二进制表示中最低位1的位置。分析与解法:我们不要去计算N!的值,如果我们从”哪些数相乘能得到10“这个角度来考虑,问题就变得简单多了。首先考虑,如果N!=K*(10^M) 且k不能被10整除,那么N!末尾后面有M个0.在考虑对N!进行质因数分解,N! =2xx 3yx 5z…由于10=2*5,所欲M只跟X和Z有关。每对2和5相乘都可以得到一个10,于是M=min(x,z).不能看出X大于等于Z,因为能被2整除的数的概率比能被5整除的数要高的多,所以把公式简化为M=Z;这意味着所以只要求求多少个5即可。求5的个数可以有两 阅读全文

21点游戏规则

2013-08-22 18:57 by youxin, 10483 阅读, 0 推荐, 收藏,
摘要:21点又名黑杰克(BlackJack) ,起源于法国,现已流传到世界各地。现在在世界各地的赌场中都可以看到二十一点,随着互联网的发展,二十一点开始走向网络时代。该游戏由 2 到 6 个人玩,使用除大小王之外的52 张牌,游戏者的目标是使手中的牌的点数之和不超过 21 点且尽量大。有着悠久的历史。游戏规则21点一般用到1-8副牌。庄家给每个玩家发两张牌,一张牌面朝上(叫明牌),一张牌面朝下(叫暗牌);给自己发两张牌,一张暗牌,一张明牌。大家手中扑克点数的计算是:K、Q、J 和 10 牌都算作 10 点。A 牌既可算作1 点也可算作11 点,由玩家自己决定。其余所有2 至9 牌均按其原面值计算。首 阅读全文

羊和汽车问题(或s三门问题(Monty Hall problem)亦称为蒙提霍尔问题)

2013-08-22 18:35 by youxin, 5490 阅读, 0 推荐, 收藏,
摘要:三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机会率?如果严格按照上述的条件的话,答案是会—换门的话,赢 阅读全文

KMP算法与一个经典概率问题

2013-08-22 16:44 by youxin, 431 阅读, 0 推荐, 收藏,
摘要:考虑一个事件,它有两种概率均等的结果。比如掷硬币,出现正面和反面的机会是相等的。现在我们希望知道,如果我不断抛掷硬币,需要多长时间才能得到一个特定的序列。序列一:反面、正面、反面序列二:反面、正面、正面首先,我反复抛掷硬币,直到最近的三次抛掷结果形成序列一,然后我记下这次我抛掷了多少次才得到了我要... 阅读全文

matrix67:kmp算法详解

2013-08-22 16:36 by youxin, 1075 阅读, 0 推荐, 收藏,
摘要:个人认为KMP是最没有必要讲的东西,因为这个东西网上能找到很多资料。但网上的讲法基本上都涉及到“移动(shift)”、“Next函数”等概念,这非常容易产生误解(至少一年半前我看这些资料学习KMP时就没搞清楚)。在这里,我换一种方法来解释KMP算法。假如,A="abababaababacb",B="ababacb",我们来看看KMP是怎么工作的。我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符(j当然越大越 阅读全文

递归实现回文判断

2013-08-22 15:35 by youxin, 5219 阅读, 0 推荐, 收藏,
摘要:首先我们要考虑使用递归的2个条件,原问题是否可以分解为形式相同但规模更小的问题,还有就是如果存在这样的分解,那么这种分解是否存在一种简单情境?先来看第一点,是否存在一种符合条件的分解。容易发现,如果一个字符串是回文,那么在它的内部一定存在着更小的回文。 比如level里面的eve也是回文。 而且,我们注意到,一个回文的第一个字符和最后一个字符一定是相同的。所以我们很自然的有这样的方法:先判断给定字符串的首尾字符是否相等,若相等,则判断去掉首尾字符后的字符串是否为回文,若不相等,则该字符串不是回文。 注意,我们已经成功地把问题的规模缩小了,去掉首尾字符的字符串当然比原字符串小。接着再来看第二点, 阅读全文

回溯法解0/1背包问题

2013-08-22 14:34 by youxin, 1005 阅读, 0 推荐, 收藏,
摘要:我们前面说过,贪心算法用价值重量比对于可分割的背包问题是有效的,但对于0/1背包问题就无效的(0/1背包是不能分割,要就要,不要就不要)。本节用回溯法解0/1背包问题,求解过程如下:在搜索过程中,尽量沿着左儿子节点前进,当不能沿着左儿子节点继续前进时,就得到问题的一个部分解,并把搜索转移到右儿子子树。此时,估计由这个部分解所能得到的最大价值,把该值与当前的上界进行比较,如果高于当前的上界,就继续由右儿子子树向下搜索,扩大这个部分解,直到找到一个可行解,最后把可行解保存起来,用当前可行解的值刷新目标函数的上界,并向上回溯,寻找其他可能解;如果有部分所估计的最大值小于当前的上界,就丢弃正在搜索的部 阅读全文

冒泡排序和直接选择排序详解

2013-08-21 15:17 by youxin, 914 阅读, 0 推荐, 收藏,
摘要:假设 一个大小为n的数组,元素为a[0],a[1],.........a[n-1]。要排成单调递增。常用的就是冒泡排序和直接选择排序。冒泡排序基本思想: 首先要进行n-1轮冒泡,每次冒泡时把2个元素交换,把最大的放在底部,等冒泡完成了,最后的一个是最大的。void bubbleSort (int a[],int n){ for(int i=0;ia[j+1]) { int tmp=a[j];a[j]=a[j+1];a[j+1]=tmp; } } }}输入:59 8 5 1 4输出:我在:n-1轮循... 阅读全文

回溯法求解哈密顿回路问题

2013-08-21 14:52 by youxin, 6001 阅读, 0 推荐, 收藏,
摘要:假设图中有n个顶点1,2,3,4,5,6,7用x[i] 存储问题的解。x[1]存储初始点,x[2]存储第二个点。以此类推。bool b[n+1][n+1] 存储图的邻接矩阵。约束条件:xi!=xj 0 #includeusing namespace std; bool b[100][100]; //图的邻接矩阵 bool check(int x[],int n, int k){ for(int i=1;i1) { x[k]+=1; while(x[k]>n; int *x=new int[n+1]; int edges;... 阅读全文

一个i++和++i导致的严重的错误

2013-08-20 21:11 by youxin, 336 阅读, 0 推荐, 收藏,
摘要:当我曾经在写一个strlen的实现时,用递归写出了如下的代码:int strlen(const char *s){ if(*s=='\0') return 0; else return strlen(s++)+1;}程序一运行就崩溃了,why!都是s++惹的或!原因在于s++,s指针还没有+1时就去调用strlen,如此循环,s指向的始终是首字符,形成了无穷递归,改成strlen(++s)就好了。 阅读全文
上一页 1 ··· 139 140 141 142 143 144 145 146 147 ··· 269 下一页