先给答案:493827152python
我才开始想到的解法:数组
#coding:utf8 #问题:987654321的阶乘转换为12进制,结尾有多少个0? #个人解法:把每一个元素分解到两个数组中去,而后结对取出来。结对数就是最后0的个数。。 def i3m(num):#是否是3的倍数 return not bool(num%3) def i2m(num):#是否是2的倍数 return not bool(num%2) def cut3(num):#递归切数字 a,b=divmod(num,3) if b==0: s3.append(3) return cut3(a) else: return num def cut2(num): a,b=divmod(num,2) if b ==0: s2.append(2) return cut2(a) else: return num n=0 s2=[] s3=[] for i in xrange(2,987654322): if i cut2(cut3(i)) print i, if len(s2)>=2 and len(s3)>=1:#每次处理完一个数就去清理下数组 s2.pop(0) s2.pop(0) s3.pop(0) n+=1 print n
#额,发现有更好的办法,只去算出出现次数最少的那个质因数个数就行了,12=2*2*3,可是怎么知道2个2多,仍是3多?app
#想不到证实的办法。。工具
#发现规律:spa
工具:指针
#coding:utf8 def g(x):#求末尾‘0’ if x.endswith('L'): x=x[:-1] a=list(x) a.reverse() n=0 for i in a: if i=='0': n+=1 else: break return n f=lambda x: x*f(x-1) if x!=0 else 1 #求阶乘 def i3m(num):#是否是3的倍数 return not bool(num%3) def i2m(num):#是否是2的倍数 return not bool(num%2) n3=n2=0 t3=t2=0 def cut3(num):#统计3的个数使用了c中指针计数的方法。O(∩_∩)O哈哈~ a,b=divmod(num,3) global n3,t3 if b==0: if t3==0: n3=1 else: n3+=1 t3=1 return cut3(a) else: if t3==0: n3=0 else: t3=0 return n3 def cut2(num):#统计2的个数 a,b=divmod(num,2) global n2,t2 if b ==0: if t2==0: n2=1 else: n2+=1 t2=1 return cut2(a) else: if t2==0: n2=0 else: t2=0 return n2
先搞下10进制的试试。。确定有规律。code
g(str(f(20)))==4,g(str(f(25)))==6,g(str(f(125)))=31,g(str(f(130)))=32,g(str(f(625)))=156 。。。blog
20/5=4, 25/5=5,125/5=25,130/5=25,625/5=125..递归
156=625/5+25+5+1it
32=130/5+5+1
6=1+5
规律:m阶乘转换为10进制后末尾0的个数就是m/5+5**(math.log(m,5)-2)+5**(math.log(m,5)-3)+。。。+5**0
math.log(987654321,12)=8.33...
987654321/12=82304526
工具:求阶乘和
def m(i,j): s=0 for k in range(j+1): s+=i**k return s
工具:求连续几个数最小公倍数:
def smallest_no_interval_number_multi(n): d=int(math.ceil(math.log(n,2))) t=[] for i in range(2,d+1): if is_prime(i): t.append(i) m=dict.fromkeys(iter(t),1) for i in t: m[i]=int(math.log(n,i)) for i in range(d+1,n+1): if is_prime(i): m[i]=1 s=1 for i in m: s*=i**m[i] return s