摘要: 问题:给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数。解法一:最直接的方法就是从1开始遍历到N,将其中每一个数中含有“1”的个数加起来,就得到了问题的解。1 int CountOne(int N){2 int num=0;3 while(N){4 num+=((N%10==1)?1:0);5 N/=10;6 }7 return num;8 }此方法简单,容易理解,但它的问题是效率,时间复杂度为O(N * lgN),N比较大的时候,需要耗费很长的时间。解法二:归纳法寻找N... 阅读全文
posted @ 2013-03-29 16:26 放空自己 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 直接的方法是对所有的id进行排序,然后在扫描一遍ID列表,统计各个ID出现的次数。如果某个ID出现的次数超过一半,那么就输出这个ID这个算法的时间复杂度是O(N*logN+N)。如果ID列表有序,则不需要扫描列表。如果一ID出现的次数超过总数的一半。那么无论水王的ID是什么,这个有序表的第N/2项 一定会是这个ID以上两种方法都是先对ID列表进行排序,时间复杂度没有根本改进,能否避免排序?如果每次删除两个不同的ID,那么,在剩下的列表中,水王ID出现的次数仍然超过总数的一半。总的时间复杂度是O(N)。int Find(int *ID,int N){//每次删除两个不同的id int c... 阅读全文
posted @ 2013-03-29 10:58 放空自己 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 问题:1,求N!末尾有多少个0? 2,N!的二进制表示中最低位1的位置?问题1的解法一:如果N!= K×10M,且K不能被10整除,那么N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^x)×(3^y)×(5^z)…,由于10 = 2×5,所以M只跟X和Z相关,每一对2和5相乘可以得到一个10,于是M = min(X, Z)。不难看出X大于等于Z,因为能被2整除的数出现的频率比能被5整除的数高得多,所以把公式简化为M = Z。问题相当于求N!中有质因数5的个数。解法二:Z=[N/5]+[N/5^2]+[N/5^3]……int NumberOfFi 阅读全文
posted @ 2013-03-29 09:41 放空自己 阅读(179) 评论(0) 推荐(0) 编辑