编程之美
wxl3105
这个作者很懒,什么都没留下…
展开
-
编程之美2.2——不要被阶乘吓倒
N!中末尾0的个数 对N!进行质因数分解,N!可以分解成2^x * 3^y * 5^z*,只有2*5才会使N!的末尾产生1个0, 也就是说N!的质因数分解中有多少个2,5对末尾就有多少个0,而N!的质因数中5的个数要少于2的 个数,也就是说2,5对的个数取决于质因中5的个数,所以问题转化为求N!中质因数5的个数 5的个数Z=[N/5] + [N/5^2] + [N/5^3} + ...原创 2012-06-10 17:21:20 · 536 阅读 · 0 评论 -
编程之美2.1——二进制中1的个数
1.二进制中1的个数 int NumberOf_1(int n) { int count = 0; while(n) { count++; n = n & (n - 1); } return count; } 2.一个数是否是2的N次方 int Is_2N(int n) { int tmp =原创 2012-06-10 17:27:21 · 632 阅读 · 0 评论 -
编程之美2.4——1的数目
/*总体思路:先求个位上出现的1的个数,再找十位再找百位。。 先看个位找找规律: 5(05) 1 1 15 2 1,11 25 3 1,11,21 35 4 1,11,21,31 ... 325 33 1,11,21,31,41,...,301,311,321 结论:个位上原创 2012-06-10 17:31:02 · 1334 阅读 · 1 评论 -
编程之美2.12——快速寻找满足条件的两个数
前奏 希望此编程艺术系列能给各位带来的是一种方法,一种创造力,一种举一反三的能力。本章依然同第四章一样,选取比较简单的面试题,恭祝各位旅途愉快。同样,有任何问题,欢迎不吝指正。谢谢。 第一节、寻找满足条件的两个数 第14题(数组): 题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任转载 2012-06-11 10:43:10 · 3220 阅读 · 0 评论 -
编程之美2.7——最大公约数问题
1、辗转相除法 int gcd1(int x, int y) { if(y == 0) return x; else return gcd1(y, x % y); } 2、辗转相减法 int gcd2(int x, int y) { if(x < y) return gcd2(y, x); if(y == 0) return x; else return gcd原创 2012-06-14 19:34:58 · 689 阅读 · 0 评论 -
编程之美2.17——数组循环移位
1、最简单的做法一位一位移,时间复杂度O(K*N) string RightShift1(string &s, int n, int k) { while(k--) { char c = s[n-1]; for(int i = n - 1; i > 0; i--) s[i] = s[i-1]; s[0] = c; } return s; } 2、当K很大时,移原创 2012-06-14 19:38:03 · 602 阅读 · 0 评论 -
编程之美4.4——点在三角形内
第一种方法:面积相等法 如果点在三角形内部,则如果将三角形的三个顶点与这个点相连所得的三个小三角形的面积之和与原三角形的面积相等 S(A,B,D) + S(A,C,D) + S(B,C,D) = S(A,B,C) 第二种方法:向量叉积法 判断点P3是否在向向P1P2的左边,只需要通过两个向量P1P2、P1P3做叉积就可以判断 P1P2 X P1P3 > 0 则 P3在P1P2左边 P1原创 2012-09-13 13:36:00 · 853 阅读 · 0 评论 -
编程之美2.3——发帖水王(+扩展)
发帖水王——找出数组中超一半的数 //不断找出两个不相同的数,然后把它们删掉,当再找不出不相同的数时,剩下的数就是过半的数 int findOverHalf(int *ID, int N) { int candicate; int nTime, i; for(i = nTime = 0; i < N; i++) { if(nTime == 0) { candicate =原创 2012-06-10 17:39:03 · 8965 阅读 · 0 评论