2017-03-07 42 views
0

我不知道如何框架這個問題。讓我舉幾個場景來解釋我需要什麼。需要提供的號碼的下一個里程碑號

方案1:

我提供號碼作爲9600和欲被返回10000

方案2:

我提供號碼作爲98700和欲被返回100000

方案3:

我提供的號碼爲196000,我想退貨200000

這就是我真正想要的。 Java或Javascript解決方案都很好。任何幫助將非常感激。在此先感謝

+0

到目前爲止你做了什麼?你的問題是什麼? –

+0

@ChrisStarling正如我所說我不知道​​如何框架這個問題。我會盡力傳達。基本上我希望下一個最高的里程碑數字(如果我可以這樣說的話)提供我提供的數字。我在想,但想不出一個邏輯來做到這一點。感謝您的及時回覆 –

回答

3

你需要對數爲:

的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

嘿,它像一個魅力工作。非常感謝:)馬上接受答案 –

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

如何解決方案1? – Psi

+0

這是一個很糟糕的問題,因爲他沒有意識到這個問題,這個答案幫助他解決了問題,所以他可以開始解決問題了......這是一個舍入問題!不是「下一個里程碑」問題,沒有Math.nextMilestone()。我一直在那裏,不知道該問什麼。這是一個推動。 – PEWColina

+0

那麼這將是值得評論,但它不是一個問題的答案 – Psi

1

另一個解決方案

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

我不確定你需要什麼,但是這段代碼覆蓋了你的例子。

0

我認爲接受的答案在概念上是最好的。

如果由於某種原因,你需要做出很多里程碑式的計算和性能將是一個問題(這是所有純屬假設),你可以緩存的里程碑,以減少計算開銷如下:

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