编程之美
寻找心灵境地
这个作者很懒,什么都没留下…
展开
-
给定一个整数N,求N!末尾有多少个0?N!的二进制表示中最低1的位置?
1.末尾为0,说明肯定有2*5的因子,所以只要统计N*(N-1)*...1中因子2和5的个数。显然在这里因子2的个数是多于因子5的个数,所以只要统计有多少个因子5就行了。int Count(int n){ int sum=0; for(int i=n;i>1;i--) { int k=i; while(k%5==0) { sum++; k=k/5;原创 2014-03-13 17:40:40 · 931 阅读 · 0 评论 -
寻找最大的K个数
问题:有N个无序的数,假定他们各不相等,怎么选出其中最大的k个数?解法一:把所有的数都排序,然后输出最后k个数。这样效率很低,时间复杂度为O(NlogN)+K。解法二:考虑快速排序,从N个数中任选一个为X,排序后左边所有的数为集合AX;若|B|=K则右边的数就是最大的K个数;若|B|>K,在集合B中在用快排;若|B|#includeusing namespace std;原创 2014-03-18 17:26:21 · 440 阅读 · 0 评论 -
二进制中1的个数
对于一个字节(8bit)的无符号整形变量,求其二进制表示中“1”的个数。1.最简单的也是最容易想到的就是将这个数对2取余,然后再除以2,一直循环到为0。这就是将一个数转换成2进制的方法。int Count(int n){int sum=0;while(n){if(n%2==1)sum++;n=n/2;}return sum;}2.一个正数除以原创 2014-03-12 21:43:33 · 440 阅读 · 0 评论 -
“1”的数目
题目:给定一个十进制正整数N,写下从1开始到N的所有整数,然后数一下其中出现的所有“1”的个数。例如:N=21,2,只有1个“1”。N=121,2,3,4,5,6,7,8,9,10,11,12,这里有5个“1”。问题:写一个函数F(N),返回1到N之间出现的“1”的个数,比如F(5)=12;解答:这道题要分别统计1到N之间的数个位上是“1”,十位上是“1”,百位原创 2014-03-17 15:33:13 · 640 阅读 · 0 评论 -
发帖水王
寻找所有帖子中,帖子总数超过一半的作者,每个作者的ID是唯一的。第一种解法:将这些ID全部排序假设有N个,则第N/2项的ID一定是“水王”的ID。这里排序的时间最少需要NlogN。第二种解法:可以采用分治的思想,每次删除2个不同的ID,则剩下的ID中,“水王”的ID出现次数仍然超过总数的一半。Type Find(Type *ID,int N){ Type candicate; i原创 2014-03-17 10:13:43 · 679 阅读 · 0 评论 -
精确表达浮点数
在计算机中,使用float或double来存储小数是不能得到精确的值的。如果希望得到精确的值最好用分数形式来表示小数,有限循环小数或无限循环小数都可以转化成分数。比如0.9=9/100.333(3)=1/3(括号中数字表示循环节)当然一个小数也可以用好几种分数形式来表示。比如:0.333(3)=1/3=3/9问题:给定一个有限小数或是无限循环小数,已分数形式返回这个小数。解原创 2014-03-19 14:23:18 · 616 阅读 · 0 评论 -
最大公约数
写一个程序,求两个正整数的最大公约数。如果两个正整数都很大,有什么简单的算法吗?例如:给定两个数1 100 100 210 001,120 200 021,求出其最大公约数。解法一:最容易想到的就是欧几里得算法,也就是辗转相除法:gcd(a,b)=gcd(b,a%b)int gcd(int a,int b){ if(a<b) return gcd(b,a); if(b==0)原创 2014-03-20 14:43:20 · 509 阅读 · 0 评论 -
子数组的最大乘积
给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意N-1个数的组合中乘积最大的一组,并写出算法时间复杂度。解法一:N个数组arry[0...n-1]被arry[i]分成三份arry[0...i-1],arry[i],arry[i+1...n-1],除去arry[i]就是N-1个数相乘。可设begin[i]表示前i个元素相乘即begin[i]=arry[0]*...arry[i-1]原创 2014-03-26 22:29:02 · 393 阅读 · 0 评论 -
快速寻找满足条件的两个数
能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简单化,假定数组中肯定存在至少一个符合要求的解。解法一:穷举,从数组中任取两个数字,计算两者之和是否为给定值。时间复杂度为O(N^2)。解法二:假定两数之和为sum,对数组中每个数字a[i],判断sum-a[i]是否在数组中,这样就变成了查找算法,如果在无序数组中查找要O(N)时间,所以总共还是O(N^2),转换一下,原创 2014-03-26 14:42:43 · 555 阅读 · 0 评论