In alternativa alla manipolazione separata delle cifre, come avviene nelle soluzioni ricorsive e in quelle che utilizzano un vettore <, è possibile fare affidamento sulle rappresentazioni della macchina e sull'aritmetica. Non è più veloce se è necessario esaminare ogni cifra ogni volta attraverso il ciclo, ma se si sta implementando un iteratore, si ridurrà lo spazio di archiviazione all'interno dell'iteratore e, se non si utilizza ogni singolo valore, potrebbe anche migliorare la tua efficienza. In ogni caso, è un approccio equivalente interessante. Qui va ...
Innanzitutto pensa al caso un po 'più generale in cui sono presenti i cicli nidificati n
, ognuno dei quali conta da 0 a num
. In questo caso, stai essenzialmente contando da 0 a num^n - 1
nel numero di base.Così si può fare qualcosa di simile:
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.
}
Nota che:
- Se nessun tipo intero nativo è abbastanza grande per la vostra applicazione, quindi si dovrà utilizzare una sorta di vasta classe intero. Ciò ridurrà l'efficienza della memoria e incrementerà le parti, anche se forse non tanto quanto usare un vettore di lunghezza num.
- Se si guarda ogni cifra ogni volta, quindi è necessario un vettore di cifre e non si è ottenuto nulla. Questo è davvero molto utile quando non guardi tutte le cifre ogni volta.
- Tutti i divisori devono essere precalcolati, quindi è necessario mantenere un vettore per quello!
In ogni caso, per una particolare domanda, tu non vuoi contare fino a num
ogni volta, si voleva contare fino a num - (the sum of the already decided digits)
. Il modo più semplice per spiegare ciò è semplicemente inserendo una condizione appropriata continue
nei propri loop. Qui si è con alcuni valori sostituiti in per quando n=2
e 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
}
}
(Nel caso in cui non è ovvio, io non significa che si dovrebbe effettivamente utilizzare 100 e 10 nel codice, questo è solo un esempio illustrativo .)
È possibile rendere questo più efficiente calcolando quanto incrementare x di, o riducendo l'intervallo di x e quindi mappando direttamente al sottospazio anziché all'intero spazio. (Ma in 2-d e 3-d stai usando esattamente la metà dei valori possibili, in modo che il lavoro extra ti possa solo accelerare di 2. Penso che sia lo stesso quando n> 3, ma sono troppo pigro per capirlo in questo momento, mi spiace!)
È necessario rendere la funzione ricorsiva. Avere un argomento che specifica quanti cicli annidati devono ancora essere eseguiti. Quando è zero, fai il suo "thang". :-P Sarò felice di aiutarti ulteriormente una volta che avrò visto il tuo primo tentativo. :-) –
Se si tratta di compiti a casa, si prega di etichettarlo così, altrimenti, ti aiuterò affermando il vostro caso aziendale. –
Forse questo è il lavoro a casa? Cosa hai inventato finora? – womp