需要提供的号码的下一个里程碑号

需要提供的号码的下一个里程碑号

问题描述:

我不知道如何框架这个问题。让我举几个场景来解释我需要什么。需要提供的号码的下一个里程碑号

方案1:

我提供号码作为9600和欲被返回10000

方案2:

我提供号码作为98700和欲被返回100000

方案3:

我提供的号码为196000,我想退货200000

这就是我真正想要的。 Java或Javascript解决方案都很好。任何帮助将非常感激。在此先感谢

+0

到目前为止你做了什么?你的问题是什么? –

+0

@ChrisStarling正如我所说我不知道​​如何框架这个问题。我会尽力传达。基本上我希望下一个最高的里程碑数字(如果我可以这样说的话)提供我提供的数字。我在想,但想不出一个逻辑来做到这一点。感谢您的及时回复 –

你需要对数为:

的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

嘿,它像一个魅力工作。非常感谢:)马上接受答案 –

let value=19600; 
let rounded = Math.ceil(value/100000)*100000; 
console.log(rounded); 
+0

如何解决方案1? – Psi

+0

这是一个很糟糕的问题,因为他没有意识到这个问题,这个答案帮助他解决了问题,所以他可以开始解决问题了......这是一个舍入问题!不是“下一个里程碑”问题,没有Math.nextMilestone()。我一直在那里,不知道该问什么。这是一个推动。 – PEWColina

+0

那么这将是值得评论,但它不是一个问题的答案 – Psi

另一个解决方案

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))); 
    } 
}