阶乘结果换算进制后得到数字的尾部有几个0
来源:互联网 发布:程序员之死女主角 编辑:程序博客网 时间:2024/05/22 07:06
原题地址:
https://www.codewars.com/kata/trailing-zeros-in-factorials-in-any-given-integer-base/train/ruby
最开始没有仔细思考,先计算阶乘,再统计0的个数,但测试用例中包括大数情况,例如:
trailing_zeros(93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000, 100)
,很明显这种算法无法实现。
后来经过查询,在https://www.cnblogs.com/hutonm/p/5624996.html 发现了新思路;
最新算法:
def trailing_zeros(num, base) start = Time.now arr = list(base) # puts "time_list:#{(Time.now - start) * 1000}" brr = Hash.new(0) arr.each do |item| brr[item] = figure(num, item) end # puts "time_figure:#{Time.now - start}" uniq_arr = arr.uniq counter = Hash.new(0) arr.each {|val| counter[val] += 1} # puts "time_counter:#{Time.now - start}" crr = [] brr.each do |key, value| crr.push(value / counter[key]) end # puts "time_crr:#{Time.now - start}" crr.min # puts "time_total:#{Time.now - start}"enddef figure(num, item) num >= item ? num / item + figure(num / item, item) : 0enddef list(base) i = 2 j = 0 arr = [] while (base > 1) do if base % i == 0 max = i while base % i == 0 base /= i arr[j] = max j += 1 end end i += 1 end return arrend
经过测试:
require 'benchmark' Benchmark.bmbm(10) do |t| t.report{puts trailing_zeros(93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000, 100)} t.report{puts trailing_zeros(93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000, 100)} t.report{puts trailing_zeros(93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000, 100)} end
结果如下:
Rehearsal ---------------------------------------------- 11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364607999999999999999999999950 0.000000 0.000000 0.000000 ( 0.003088) 11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364607999999999999999999999950 0.010000 0.000000 0.010000 ( 0.002103) 11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364607999999999999999999999950 0.000000 0.000000 0.000000 ( 0.002209)------------------------------------- total: 0.010000sec user system total real 11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364607999999999999999999999950 0.000000 0.000000 0.000000 ( 0.001200) 11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364607999999999999999999999950 0.000000 0.000000 0.000000 ( 0.001220) 11665776930493019085212404857033337561339496033047702683574120486902199999153739451117682997019564785781712240103402969781398151364607999999999999999999999950 0.000000 0.000000 0.000000 ( 0.001380)
每次运行时间在1.5ms以内。
但是还是不符合题目要求,提交反馈结果如下:
Process was terminated. It took longer than 12000ms to complete
尝试优化list()方法,优化效果不明显:
# return the number of trailing zeros in num! (base)def trailing_zeros(num, base) arr = list(base) brr = Hash.new(0) arr.each_key do |key| brr[key] = figure(num, key) end crr = [] brr.each do |key, value| crr.push(value / arr[key]) end crr.minenddef figure(num, item) num >= item ? num / item + figure(num / item, item) : 0enddef list(base) i = 2 hash = Hash.new(0) while (base > 1) do count = 0 if base % i == 0 while base % i == 0 base /= i count += 1 end hash[i] = count end i += 1 end return hashend
待更新。。。。
阅读全文
0 0
- 阶乘结果换算进制后得到数字的尾部有几个0
- LeetCode Factorial Trailing Zeroes(计算阶乘结果尾部有几个0)
- 求1000的阶乘结果尾部0的个数
- 求1000的阶乘结果尾部0的个数
- 求1000的阶乘结果尾部0的个数
- 求1000阶乘的结果尾部0的个数
- 阶乘尾部的0
- 阶乘尾部包含n个0的最小数字
- 如何计算阶乘运算结果尾部有多少个零
- 阶乘的尾部有多少个零?
- 阶乘尾部0的个数
- 求n!阶乘结果末尾有几个0
- n的阶乘尾数有几个0
- N的阶乘后有多少0
- 求关于n的阶乘结果后面有几个零?如2016的阶乘(网易的笔试选择题)
- N!的结果中末尾有多少个0,即可以在N阶乘中找到5的个数就是N阶乘结果的末尾会有几个0了,请看以下分析
- 计算1024的阶乘结果有多少个0
- 计算1024的阶乘结果有多少个0
- java作业
- C# 进程启动
- 创建一个slider UI,并将其呈现在世界坐标作为血条
- 一步一步创建GStreamer插件(ZZ)
- 【JAVA基础】BitSet
- 阶乘结果换算进制后得到数字的尾部有几个0
- Git和码云的使用
- threat
- 初识JVM(1)
- Spring Cloud 之服务注册中心高可用
- JavaScript简介及输出方式
- 9.密码翻译
- ETL流程概述及常用实现方法
- 目前需要注意的两件事情