先给答案:493827152
我才开始想到的解法:
#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多?
#想不到证明的办法。。
#发现规律:
工具:
#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进制的试试。。肯定有规律。
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 。。。
20/5=4, 25/5=5,125/5=25,130/5=25,625/5=125..
156=625/5+25+5+1
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