编程之美——阶乘问题、最大公约数
问题一:正整数N!的末尾有多少个零?
解法一:问题等价于N!因式分解中5的指数次数;
解法二:f(n)表示正整数n因式分解中5的指数的次数,f(n!)=k+f(k!) (k=n/5) 可证明见:http://15838341661-139-com.iteye.com/blog/1883889
即:f(n!)=n/5+f(n/5!)=n/5+n/5^2+........
int count(int n) { int ret=0; while(n) { ret+=n/5; n/=5; } return ret; }
问题二:N!二进制表示中最低位1的位置?
int count(int n) { int ret=0; while(n) { n>>=1; ++ret; } return ret; }
最大公约数:可使用辗转相除法或相减法计算,但是相除法计算大整数出发复杂度较高,相减法循环次数较多
可采用:整数a,b的最大公约数与a/q、b相同,其中q为质数,同时不被b整除,算法如下:
a,b为偶数,=2*f(a,b)
a为偶数,b为奇数,=f(a>>1,b),同a奇数,b偶数
a,b同为奇数,=f(b,a-b);

浙公网安备 33010602011771号