2015-06-12 15 views
6

bölünebilir iki basamağı oluşturduğu en küçük sayı bulun ben bir röportajda şu soru soruldu ve benVerilen sayının

oluşturulabilir en küçük numarayı bulmak için bir program yazın nasıl yapılacağı hiçbir ipucu yoktu Belirli bir sayı ile bölünebilen 0 ve 9 ile. verilen sayı ise belirli sayıda çıkışı 90, 2 ise belirli sayıda 10 çıkışı ise
Örneğin, 3 çıkış 90

çevrimiçi bu çözüm bulunmuştur, 9 olmalıdır ama yok Bunu anlayın: -

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

Herkes iyi bir anlayış veya alternatif bir çözüm konusunda yardımcı olabilir mi?

+2

1, 10, 11 vb. Ikili sayıları üretir, 1'i 9 ile değiştirir ve bölünebilirlik için sınamalar. Bu kadar. –

+1

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

+0

@TagirValeev Tamsayı Taşması. Bunun yerine 'long' kullanın ve '90090909909' –

cevap

2

Benzer bir yaklaşımdır. Biz 33 için elle yapmak yapmak nasıl

:

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. 

en deseni bakalım.

0 9 90 99 

Nasıl görünüyor? ikili! Evet, bir 1 yerine 9.

Şimdi ikili olarak (1'i 9 ile değiştirerek) bölen bir sayı alana kadar 0'dan gideceğim.

biz

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 

olsun Biz artan 0 bu ve 9 kullanılarak oluşturulabilir tüm numaraları olsun.

+0

Sonuçla ilgili bölümü, koşulları yerine getiren * en küçük * sayı eksik. Algoritma, biner sayılarla * yukarı doğru * ilerleyerek ve en küçük ikili sayıyı veren ilk olanı döndürerek hesaba katılır. Bu çeviri, * çevrilmiş * sayılar için de geçerlidir çünkü çeviri tekdüze bir işlevdir. – mastov

+1

@mastov de sanırım o kısmı kaçırmıyor! – Junaid

+0

@Junaid: Üzgünüm, onu göremiyorum. – mastov

0

Tercüme yönteminin daha fazla açıklamaya ihtiyaç duyduğunu hayal ediyorum. Basitçe "0" ve "1" yerine "0" ve "9" dan oluşan "bin" sayısının ikili bir temsilini üretiyor. "Bul" yöntemi 1'den başlayıp "çeviri" ile oluşturulan sayının "bölünebilir" tarafından bölünüp bölünemeyeceğini kontrol ederken "