最有效的方法(在Java中)将数字n舍入到最接近10的幂,其中包含的数字比原始数字多一个?
e.g。 3 - > 10
432 - > 1000
241,345 - >百万
有没有办法将它放在一个O(1)行中?
我能看到的一种简单方法是使用for循环并增加10的幂,直到n /(10 ^ i)<1。 1,但那不是O(1)而是O(log n)。 (好吧,我正在猜测它的日志,因为它涉及到权力!)
答案 0 :(得分:5)
如果您正在寻找字符串,可以使用Math.log10
在数组中找到正确的索引:
// Do more of these in reality, of course...
private static final String[] MESSAGES = { "1", "10", "100", "1,000", "10,000" };
public static final String roundUpToPowerOf10(int x) {
return MESSAGES[(int) Math.ceil(Math.log10(x))];
}
如果您希望它返回具有正确值的整数,您可以使用Math.pow
:
public static final int roundUpToPowerOf10(int x) {
return (int) Math.pow(10, Math.ceil(Math.log10(x)));
}
答案 1 :(得分:2)
尝试
double input = ...
double output = Math.pow(10, Math.ceil(Math.log10(input)));
然后您可以将输出转换为整数。操作量是恒定的,因此单个输入可以保证O(1)。