Como alternativa a la manipulación de los dígitos por separado, como se hace en las soluciones recursivas y las que usan un Vector <>, puede confiar en las representaciones de la máquina y la aritmética. Esto no es más rápido si necesita examinar cada dígito cada vez a través del ciclo, pero si está implementando un iterador, reducirá su espacio de almacenamiento dentro del iterador, y si no está utilizando todos los valores, entonces también puede Mejora tu eficiencia. En cualquier caso, es un enfoque equivalente interesante. Aquí va ...
Primero piense en el caso un poco más general en el que tiene n
bucles anidados, cada uno de los cuales cuenta de 0 a num
. En ese caso, básicamente estás contando de 0 a num^n - 1
en la base núm.Así que usted puede hacer algo como esto:
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.
}
Tenga en cuenta que:
- Si ningún tipo entero nativa es lo suficientemente grande como para su aplicación, entonces usted tendrá que usar algún tipo de gran clase entero. Esto reducirá la eficiencia del almacenamiento e incrementará las partes, aunque tal vez no tanto como usar un vector de longitud num.
- Si realmente miras cada dígito cada vez, entonces necesitas un vector de dígitos, y no has ganado nada. Esto es realmente más útil cuando no está mirando todos los dígitos cada vez.
- Todos los divisores deben estar precalculados, por lo que debe mantener un vector para eso.
De todos modos, para su pregunta en particular, que no desea contar con num
cada vez, que quería contar hasta num - (the sum of the already decided digits)
. La forma más sencilla de dar cuenta de esto es simplemente colocando una condición continue
apropiada en sus bucles. Aquí se está con algunos valores sustituidos en para cuando n=2
y 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
}
}
(En caso de que no es obvio, no quiero decir que realmente debe utilizar 100 y 10 en el código, esto es sólo un ejemplo ilustrativo .)
Puede hacer que esto sea más eficiente al calcular cuánto aumentar x, o al reducir el rango de x y luego mapear directamente a su subespacio en lugar de a todo el espacio. (Pero en 2-dy 3-d está utilizando exactamente la mitad de los valores posibles, por lo que el trabajo adicional solo le daría una aceleración de 2. Creo que es lo mismo cuando n> 3, pero soy demasiado vago para entenderlo en este momento, lo siento!)
Necesita hacer que su función sea recursiva. Tenga un argumento que especifique cuántos bucles anidados todavía quedan para ejecutarse. Cuando es cero, hazlo "thang". :-P Estaré encantado de ayudarte aún más una vez que vea tu primer intento de esto. :-) –
Si esto es tarea, por favor etiquételo así, de lo contrario, se ayudará exponiendo su caso de negocio. –
¿Es acaso esta tarea? ¿Qué has pensado hasta ahora? – womp