2010-09-09 18 views
11

Sekwencja wygląda następująco: 7,8,77,78,87,88,777,778,787,788 i tak dalej ..Jaka jest logika do rozwiązania tej sekwencji?

Jaka może być logika do znalezienia n-tego numeru sekwencji? Próbowałem tego, dzieląc go przez 2, a następnie przez 4, a więc, ale wydaje się, że nie działa.

+9

Osoby, które głosują, aby je zamknąć: w jaki sposób algorytm znajdowania n-tego elementu sekwencji jest poza tematem? –

+2

Byłoby miło, gdyby ludzie komentowali, ale gdybym musiał zgadywać, że to pachnie jak praca domowa, a prośba jest kompletna, a nie podpowiedź. –

+1

@Nikita Rybak: Nie ma sensu mieć algorytmu n-tego elementu. Każda sekwencja może być kontynuowana w dowolny sposób. –

Odpowiedz

15

obserwacje:

  1. sekwencja wydaje się być rosnącej listy numerów zawierających tylko cyfry 7 i 8.

  2. Liczba cyfr nie zmniejsza się, a dla każdej n-cyfrowej sekcji są numery 2 ** n w sekwencji.

  3. Pierwsza połowa N liczb dwucyfrowych rozpoczyna 7, a drugą połowę rozpoczyna 8.

  4. Do każdej połowy N liczb dwucyfrowych pozostałe cyfry po pierwsze są takie same jako liczby n-1 cyfrowe.

Fakty te mogą być wykorzystane do skonstruowania racjonalnie efektywne rekurencyjną implementację.

Oto implementacja C#

void Main() { 
    for (int i = 0; i < 10; i++) 
     Console.WriteLine (GetSequence(i)); 
} 

string GetSequence(int idx) { 
    if (idx == 0) return "7"; 
    if (idx == 1) return "8"; 

    return GetSequence(idx/2 - 1) + GetSequence(idx % 2); 
} 

wyjściowa:

7 
8 
77 
78 
87 
88 
777 
778 
787 
788 
+0

+1 Podoba mi się! " –

+2

wydaje się, że masz obsesję na punkcie rekurencji .. :) – Vaibhav

2

substytut 0 do 7 oraz 1 do 8 i z niego jak binarnej sekwencji

+4

Niezupełnie: 7 * = 0 * zawsze będzie 0. – tur1ng

2

wygląda jak prosty sekwencją binarną, w którym R7 oznacza binarnym zerem, a R8 oznacza binarnych 1.

+4

ok .. to dlaczego trzecia liczba to 77 lub w twoim przypadku .. 00 .. ?? – Vaibhav

+2

Sekwencja rozpoczyna się od zera binarnego, ale z dwiema cyframi zamiast z jedną. I tak dalej. Za każdym razem, gdy sekwencja przepełni swoje cyfry, uruchom ponownie na zero i dodaj kolejną cyfrę. –

+1

Problem polega na znalezieniu n-tego elementu, który wymagałby wyliczenia wszystkich elementów do n. – recursive

4

od wielkości bloku rośnie wykładniczo (2 elementy o długości 1, 4 elementy o długości 2, 8 elementy długości 3 itd.), Można łatwo określić liczbę cyfr w numerze wynikowym.

long block_size = 2; 
    int len = 1; 
    while (n > block_size) { 
     n -= block_size; // n is changed here 
     block_size *= 2; 
     ++len; 
    } 

Teraz wystarczy utworzyć reprezentację binarną z n - 1, z 7 do 8 zer i jedynek (dla wyściółka go do długości len zerami). Całkiem proste.

Zakładam, że indeksy zaczynają się od 1 tutaj.

+0

pozwala wziąć n = 10 .. które muszą dać 788 jako odpowiedź .. lub 011. ale dla n = 10, n-1 wynosi 9, co daje binarną sekwencję 1001. biorąc rozmiar bloku jako 3 wybieramy ostatnie trzy binaria, czyli 001, które nie jest odpowiedzią .. !! – Vaibhav

+1

@vaibhav Uwaga, zmienimy także _n_ w pętli. Edytowałem odpowiedź, aby to podkreślić. –

+0

ohh ya .. mój błąd .. wielkie dzięki .. – Vaibhav

22

Binary, licząc od dwóch, ignorując wiodącą cyfrę za pomocą 7 i 8 dla zera do jednego:

 7, 8, 77, 78, 87, 88, 777, 778, 787, 788 
0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011 
+0

najpiękniejsze rozwiązanie .. !! – Vaibhav

+0

+1 za rozwiązanie. Wspaniała obserwacja Pete! Oto implementacja Pythona 2.6 -for in range (2,15): print "" .join (map ((lambda x: ('8', '7') [x == '0']), bin (i) [2:]) [1:]), – Gangadhar

+1

Rozdęty. Tutaj: 'for i in range (2,15): print" ". Join ('78' [int (x)] dla x w bin (i) [3:]),' – recursive

1

Można obliczyć tę bezpośrednio dla liczby n-ty (num) bez rekursji lub zapętlenie w następujący sposób (przykładowy kod jest w MATLAB):

  • obliczyć liczbę cyfr w liczbie:

    nDigits = floor(log2(num+1)); 
    
  • Znajdź binarną reprezentację liczby num (tylko pierwsze nDigits cyfr) po uprzednim odjęciu jeden mniej niż dwa podniesione do potęgi nDigits:

    binNum = dec2bin(num-(2^nDigits-1),nDigits); 
    
  • dodać 7 do każdej wartości w ciąg zer i jedynek:

    result = char(binNum+7); 
    

A oto test, stawiając powyższe trzy kroki do jednego anonimowego funkcji f:

>> f = @(n) char(dec2bin(n+1-2^floor(log2(n+1)),floor(log2(n+1)))+7); 
>> for n = 1:20, disp(f(n)); end 
7 
8 
77 
78 
87 
88 
777 
778 
787 
788 
877 
878 
887 
888 
7777 
7778 
7787 
7788 
7877 
7878 
2

Wpisany jak PHP. Zakładam, że elementy sekwencji są ponumerowane począwszy od 1.

$n = 45; 
// let's find the 45th sequence element. 
$length = 1; 
while ($n >= pow(2, $length + 1) - 1) { 
    $length++; 
} 
// determine the length in digits of the sequence element 
$offset = $n - pow(2, $length) + 1; 
// determine how far this sequence element is past the 
// first sequence element of this length 
$binary = decbin($offset); 
// obtain the binary representation of $offset, as a string of 0s and 1s 
while (strlen($binary) < $length) { 
    $binary = '0'.$binary; 
} 
// left-pad the string with 0s until it is the required length 
$answer = str_replace(array('0', '1'), 
         array('7', '8'), 
         $binary 
         ); 
+0

+1: Wygląda na to, że mieliśmy ten sam pomysł. ;) Możesz faktycznie uniknąć pierwszej pętli while za pomocą [log] (http://php.net/manual/en/function.log.php) i [floor] (http://www.php.net/ manual/en/function.floor.php). – gnovice

+0

Tak, rozważałem log() i floor(), ale nie byłem pewien, czy floor() spowoduje problemy z powodu niedokładności zmiennoprzecinkowych w php. – Hammerite

Powiązane problemy