我想收集[a,b]范围内所有阶乘以偶数开头的数字。
例如:
a = 1, b = 10
答案:
2 3 4 8
说明:
2! = 2 = starts with even
3! = 6 = starts with even
4! = 24 = starts with even
8! = 40320 = starts with even
限制式:
1 ≤ a,B ≤ 100
下面是我的代码:
List<Integer> process(int a, int b) {
long base = i;
for(int i=1; i<=a; i++) base *= i;
if(even(base)) list.add(a);
for(int i=a+1; i<=b; i++) {
base *= i;
if(even(base)) list.add(i);
}
return list;
}
boolean even(long k) {
int z = ("" + k).charAt(0) - '0';
return z % 2 == 0;
}
这是几天前在一个编码挑战中问到的,当我实现这个的时候,15个测试用例中有6个隐藏的测试用例失败了。我不能找到这个代码中的bug是什么。
5条答案
按热度按时间00jrzges1#
我使用
BigInteger
来解决这个问题。为了加速这个过程,我将随后的阶乘计算记下来,作为未来计算的起点。我还建立了一个记录来保存相关数据,以便于这个过程。也许有一种数学方法可以预测第一个数字的奇偶性,但就目前而言,这似乎是可行的。
印刷品
第一次
声明为保存数据的记录
初始化计算阶乘的备忘录
n
,在计算时将每个阶乘添加到列表中。vlf7wbxs2#
这是一个肮脏的解决方案-我不是真的推荐它,只是在这里发布它的兴趣-但较低值的数字将有相对较小的影响,第一位数字。
原谅我的草率,我已经很久没有在Java工作了。
不管怎样,这个解决方案是基于这样一个事实,即尾随数字对前导数字的贡献不大,所以--不要告诉任何人我说这样做是可以的--我只是丢弃它们,除以10的某个幂,并且只保留
long
中我能容纳的数量。实际上,我并不确定这个公式的准确性能维持多久,我很好奇是否有人想对此发表意见,但我怀疑这个公式会一直保持到
i
(我们要取其阶乘的东西)的数字相对于long的长度变得显著为止。nbysray53#
下面的Ruby代码可以为您的参数解决这个问题。我不懂Java,但它很容易翻译。当您的输入参数太小(特别是b〈= 100)时,解决这个困难的泛型问题没有任何意义。我的数组在87处停止,因为88!到100!都有奇数的前导数字。
whhtz7ly4#
不能用Java测试,所以我用Python。下面是代码。递归公式基于被除数(y)除以除数(d)的商(q)和余数(r)的计算。除数(d)是10的递增幂。对应的Python指令:q,r=divmod(y,d)。
当然我不得不使用浮点数!它在Java中最多工作n=34!下面是Java代码的改进版本。
结果是:
这是Python的结果,注意到在i=34之前,有一个完美的对应关系。
bqujaahr5#
比你想的要简单。
1.从a循环到B
1.计算循环索引的阶乘
1.检查生成的索引的第一个字符是否为偶数,并将其添加到列表中
1.打印清单