Jako alternatywę dla manipulowania cyframi osobno, tak jak w przypadku rozwiązań rekursywnych i tych, które używają wektora <>, można polegać na reprezentacjach maszyn i arytmetyki. Nie jest to szybsze, jeśli za każdym razem musisz sprawdzać każdą cyfrę za każdym razem, ale jeśli implementujesz iterator, to zmniejszy to ilość miejsca w iteratorze, a jeśli nie korzystasz z każdej pojedynczej wartości, może również popraw swoją efektywność. W każdym razie jest to interesujące równoważne podejście. Tutaj idzie ...
Najpierw pomyśl o nieco bardziej ogólnym przypadku, w którym masz zagnieżdżone pętle n
, z których każda liczy od 0 do num
. W takim przypadku zasadniczo liczy się od 0 do num^n - 1
w bazie numer.Więc można zrobić coś takiego:
for(int x=0; x<(num^n); x++)
{
int digit_0 = x % num;
int digit_1 = (x/num) % num;
int digit_2 = (x/num^2) % num;
// etc.
}
zauważyć, że:
- Jeśli nie natywnego typu liczba całkowita jest wystarczająco duży dla danej aplikacji, a następnie trzeba będzie użyć jakiegoś dużej klasy całkowitej. Spowoduje to zmniejszenie wydajności części składowania i przyrostu, choć może nie aż tak, jak użycie wektora o długości num.
- Jeśli naprawdę za każdym razem przyglądasz się każdej cyfrze, potrzebujesz wektora cyfr i nic nie zyskujesz. Jest to bardzo przydatne, gdy za każdym razem nie patrzysz na wszystkie cyfry.
- Wszystkie dzielniki powinny być wstępnie obliczone, więc musisz zachować do tego wektor!
W każdym razie, dla konkretnego pytania, nie chcesz liczyć do num
za każdym razem, gdy chcesz liczyć do num - (the sum of the already decided digits)
. Najprostszy sposób wyjaśnienia tego po prostu poprzez umieszczenie odpowiedniego warunku continue
w twoich pętlach. Tutaj jest to z pewnymi wartościami podstawionych w Bo gdy n=2
i num=10
:
for(x=0; x<100; x++) // i.e. x < num*num
{
int ones = x%10; // i.e. x % num
int tens = (x/10) % 10; // i.e. (x/num) % num
if(ones + tens < 10)
{
// actually do work
}
}
(W przypadku, gdy nie jest oczywiste, nie oznacza, że powinieneś faktycznie korzysta 100 i 10 w kodzie, to jest tylko przykład ilustracyjny .)
Możesz zwiększyć wydajność, obliczając, o ile chcesz zwiększyć x, lub zmniejszając zakres x, a następnie odwzorowując bezpośrednio do swojej podprzestrzeni zamiast do całej przestrzeni. (Ale w 2-d i 3-d używasz dokładnie połowy możliwych wartości, więc dodatkowa praca przyniosłaby ci tylko przyspieszenie 2. Myślę, że to jest to samo, gdy n> 3, ale jestem zbyt leniwy, aby to sobie wyobrazić teraz, przepraszam!)
Musisz sprawić, by twoja funkcja była rekurencyjna. Masz argument, który określa, ile pętli zagnieżdżonych pozostało do uruchomienia. Kiedy wynosi zero, wykonaj jego "thang". :-P Z chęcią pomożemy, gdy zobaczę twoją pierwszą próbę. :-) –
Jeśli to praca domowa, proszę oznaczyć ją etykietą, w przeciwnym razie pomożecie sobie, podając uzasadnienie biznesowe. –
Czy to jest praca domowa? Co wymyśliłeś do tej pory? – womp