2013-07-02 12 views
8

Witam Oto Q, która została zadana w Adobe Interview.Numery kończące się na 3 mają co najmniej jedną wielokrotność z wszystkimi

Numbers ending in 3 have at least one multiple having all ones. 
for eg., 3 and 13 have amultiples like 111 and 111111 respectively. Given such 
a no. , find the smallest such multiple of that number. The multiple can 
exceed the range of int, long. You cannot use any complex data structure. 

Czy możesz podać mi skutecznego rozwiązania

+0

Więc co trzeba dokładnie? – felknight

+0

Odpowiedź wyjaśniająca udzielona [tutaj] (http://stackoverflow.com/a/7130063). – TheHappySloth

+0

Możliwy duplikat [Algorithm in C - gra z liczbami - liczba z 3 w jednostkach miejsce] (https://stackoverflow.com/questions/7129855/algorithm-in-c-playing-with-numbers-number-with-3 -in-units-place) – roottraveller

Odpowiedz

14

dostałem odpowiedź teraz :)

int count=1, rem=1; 
while(rem) 
{ 
rem= (rem*10+1)%n; count++; 
} 
while(count--){ cout<<"1";} 
+4

właśnie powiedziałeś, że wielokrotność może przekroczyć zakres liczb całkowitych. – Aravind

+0

@HighPerformanceMark Pytanie nie wyklucza liczb całkowitych ani długich liczb całkowitych - po prostu stwierdza, że ​​rozwiązanie może przekraczać zakres takich wartości. Nie obejmuje użycia złożonych struktur danych. Nie wyklucza to użycia arytmetyki modułowej i obserwacji relacji między 'x mod 3' i' (x * 10 + 1) mod 3', aby obliczyć ciąg znaków reprezentujących odpowiednią wielokrotność bez faktycznego obliczania takiej wielokrotności ... – twalberg

+0

@Aravind tak to jest liczba jest liczbą razy 1 występuje w wielu pętli while jest drukowanie tego numeru – Euler

2

Oto próba zrobić wydajniej, które starają 1, 11, 111, 111 ... Czy to się opłaca. Czy bardziej elegancka odpowiedź jest lepsza od próbowania liczb po jednym na raz?

Napisz liczby 1, 11, 111, ... (10^k - 1)/9, gdzie podział jest znany jako dokładny. Biorąc pod uwagę liczbę docelową w postaci 10x + 3, chcemy znaleźć najmniejsze k rozwiązania (10^k - 1)/9 = Y (10x + 3), gdzie Y jest liczbą całkowitą. Szukaj małych rozwiązań 10^k = 1 mod 9 (10x + 3). Jest to http://en.wikipedia.org/wiki/Discrete_logarithm, z tym że arytmetyczny mod 9 (10x + 3) niekoniecznie tworzy grupę - jednak algorytm http://en.wikipedia.org/wiki/Baby-step_giant-step powinien nadal obowiązywać i może być używany do wyszukiwania stale rosnących zakresów k, zamiast przeszukiwania możliwych wartości k po jednym naraz .

+0

Myślę, że to jest rzeczywiste rozwiązanie, a nie inne. Ale chciał tylko zrozumieć, jak jest skuteczny, niż próbowanie 1,11,111 itd.? Obliczamy 10^k mod A (przyjmujemy A = 9 (10x + 3)) w każdej iteracji, ze wzrostem k, prawda? Co się stanie, jeśli zmienna przechowująca 10^k zostanie przepełniona, a wynik jest bardzo duży? Czy jest to optymalna metoda, z jaką prowadzący wywiad oczekuje, że użyje przystających właściwości? -Dziękuję .. Jestem po prostu ciekawy. –

+0

Wymagana arytmetyka to mod 9 (10x + 3), a jeśli to się pojawi, nie będziesz miał szczęścia, chyba że przełączysz się na większą precyzję, ale zdarza się to trochę po przepełnieniu 10^k. Efektywność wynika z faktu, że algorytm dziecko-krok/gigant-krok pozwala na przeszukanie zakresu N możliwości w czasie O (sqrt (N)) – mcdowella

0
#include <iostream> 
using namespace std; 

int main() { 
    int t; 
    cin>>t; 
    while(t--){ 
     long long n; 
     cin>>n; 
     long long cur = 1; 
     while(cur%n!=0){ 
      cur = cur*10+1; 
     } 
     cout<<cur<<endl; 
    } 
    return 0; 
} 
+0

Użycie 'long long' do uniknięcia 'przekracza zakres int, long' jest słaba. Czy próbujesz zrozumieć _how_ inne rozwiązania nie potrzebują liczb (dużo) większych niż podana liczba? – greybeard

0

Rozwiązanie niezależne od wielkości wyjściowej:

public String ones(int n) 
{ 
    int i, m = 1; 
    String num="1"; 

    for (i = 1; i <= n; i++) { 
       if (m == 0) 
       return num; 
      /* Solution found */ 
      num=num+"1"; 
      m = (10*m + 1) % n; 
    } 
    return null; /* No solution */ 

}

Powiązane problemy