需要提供的号码的下一个里程碑号
问题描述:
我不知道如何框架这个问题。让我举几个场景来解释我需要什么。需要提供的号码的下一个里程碑号
方案1:
我提供号码作为9600和欲被返回10000
方案2:
我提供号码作为98700和欲被返回100000
方案3:
我提供的号码为196000,我想退货200000
这就是我真正想要的。 Java或Javascript解决方案都很好。任何帮助将非常感激。在此先感谢
答
你需要对数为:
的Javascript:
var base = Math.pow(10, Math.floor(Math.log(number)/Math.log(10)));
var milestone = Math.ceil(number/base) * base;
其中number
是你的电话号码,并提供是milestone
你想要得到的结果。
这里会发生什么:
- 起初我们计算
base
,它是比number
10小功率最大,所以它包含了为你的电话号码确实尽可能多的数字。计算我们的数字(log(n)/ log(10))的基数为10的对数,并将结果作为10的幂。对于4521例如将是1000 - 之后,我们由该基地将我们的数量,四舍五入到下一个完整的整数,所以千分之四千五百二十一= 4.521,围捕使得5
- 然后,我们与底座再乘以并得到结果5000
+0
嘿,它像一个魅力工作。非常感谢:)马上接受答案 –
答
另一个解决方案
public class Test
{
public static void main(final String... args) {
final int number = 98000;
final int mult = (int) Math.pow(10, String.valueOf(number).length() - 1);
System.out.println((number + mult - 1)/mult * mult);
}
}
答
public long milestone(long original) {
String strNumber = String.valueOf(original);
long result = strNumber.charAt(0) + '1';
for (int i=1; i<strNumber.length(); i++)
result *= 10;
return result;
}
我不确定你需要什么,但是这段代码覆盖了你的例子。
答
我认为接受的答案在概念上是最好的。
如果由于某种原因,你需要做出很多里程碑式的计算和性能将是一个问题(这是所有纯属假设),你可以缓存的里程碑,以减少计算开销如下:
import java.util.SortedSet;
import java.util.TreeSet;
public class MilestoneUtil {
private static final SortedSet<Long> MILESTONES;
static {
MILESTONES = new TreeSet<>();
long base = 1;
for (int i = 0; i < String.valueOf(Long.MAX_VALUE).length(); i++) {
MILESTONES.add(base);
MILESTONES.add(2*base);
MILESTONES.add(3*base);
MILESTONES.add(4*base);
MILESTONES.add(5*base);
MILESTONES.add(6*base);
MILESTONES.add(7*base);
MILESTONES.add(8*base);
MILESTONES.add(9*base);
base *= 10;
}
}
public static long nextMilestone(long current) {
return MILESTONES.tailSet(current).first();
}
public static void main(String[] args) {
printMilestone(9600);
printMilestone(98700);
printMilestone(196000);
}
private static void printMilestone(long input) {
System.out.println(String.format("The next milestone for %d is: %d", input, nextMilestone(input)));
}
}
到目前为止你做了什么?你的问题是什么? –
@ChrisStarling正如我所说我不知道如何框架这个问题。我会尽力传达。基本上我希望下一个最高的里程碑数字(如果我可以这样说的话)提供我提供的数字。我在想,但想不出一个逻辑来做到这一点。感谢您的及时回复 –