2015-06-12 57 views
6

poproszono mnie następujące pytanie w wywiadzie i nie miałem pojęcia jak to zrobićZnajdź najmniejszą liczbę utworzoną przez dwóch cyfr podzielna przez daną liczbę

Napisz program, aby znaleźć najmniejszą liczbę, która może być utworzona przez 0 i 9, który jest podzielny przez podaną liczbę.
Na przykład, jeśli podano ilość wynosi 3 wyjściowy powinien wynosić 9, czy dana liczba jest dwa wyjścia 90, czy dana liczba jest 10 wyjściowy 90

mogę znaleźć tego rozwiązania online, ale nie ma zrozumiał ten jeden bit: -

public class Smallest0And9DivisibleNumber { 
    public static int find(int divisible) { 
     int bin = 1; 
     while (true) { 
      int res = translate(bin); 
      if (res % divisible == 0) { 
       return res; 
      } 
      bin += 1; 
     } 
    } 

    private static int translate(int bin) { 
     int result = 0; 
     for (int i = Integer.toBinaryString(bin).length(); i > 0; i--) { 
      result *= result != 0 ? 10 : 0; 
      int mask = 1 << (i - 1); 
      result += (bin & mask) == mask ? 9 : 0; 
     } 
     return result; 
    } 

    public static void main(String[] args) { 
     assert find(10) == 90; 
     assert find(99) == 99; 
     assert find(33) == 99; 
     assert find(3) == 9; 
     assert find(333) == 999; 
     assert find(300) == 900; 
     assert find(303) == 909; 
     assert find(3033) == 9099; 
     assert find(3303) == 9909; 
    } 
} 

Czy ktoś może pomóc z dobrym zrozumieniem lub alternatywnym rozwiązaniem?

+2

Generuje liczby binarne 1, 10, 11 itd., Zastępuje cyfrę 1 na 9 i testy na podzielność. To wszystko. –

+1

'System.out.println (find (299))' -> '500075407' –

+0

@TagirValeev Integer Overflow. Zamiast tego użyj 'long' i otrzymasz' 90090909909' –

Odpowiedz

2

Jest to podobne podejście.

Jak to zrobić ręcznie za 33:

Let's go from the least number which will be? - 0. Is it divisible? No. 

Let's go up a number. 9. Is it divisible? No. 

Again by a number 90. Is is divisible? No. 

Again by a number 99. Is it divisible? Yes. 

Spójrzmy na wzór.

0 9 90 99 

Jak to wygląda? dwójkowy! Tak, zamiast 1 mamy 9.

Teraz przejdę od 0, aż otrzymam liczbę, która dzieli ją, w postaci binarnej (zastępując 1 przez 9).

otrzymujemy

Number Binary 0 And 9 
0  0   0 
1  1   9 
2  10  90 
3  11  99 
4  100  900 
5  101  909 
6  110  990 
7  111  999 

Otrzymujemy wszystkie liczby, które mogą być tworzone przy użyciu 0 do 9 w porządku rosnącym .

+0

Brakuje części o wyniku jest * najmniejsza * liczba, która spełnia warunki. Algorytm bierze to pod uwagę przechodząc * w górę * z liczbami binarnymi i zwracając pierwszą, która daje najmniejszą liczbę binarną. Dotyczy to również liczb * przetłumaczonych *, ponieważ tłumaczenie jest funkcją monotonną. – mastov

+1

@mastov dobrze Myślę, że on nie tęskni za tą częścią !! – Junaid

+0

@Junaid: Przepraszam, nie widzę tego. – mastov

0

Wyobrażam sobie, że metoda tłumaczenia to taka, która wymaga więcej wyjaśnień. Po prostu generuje binarną reprezentację liczby "bin" złożonej z "0" i "9" zamiast "0" i "1". Podczas gdy metoda "znajdź" zaczyna się od 1 i sprawdza, czy liczba wygenerowana przez "translate" jest podzielna przez "podzielny"