Вот как вы можете сделать это с помощью рекурсивной функции (код на Java):
void doOperation(List<Integer> list, int prefix, int minimum, int maximum) {
for (int i = 0; i <= 9; i++) {
int newNumber = prefix * 10 + i;
if (newNumber >= minimum && newNumber <= maximum) {
list.add(newNumber);
}
if (newNumber > 0 && newNumber <= maximum) {
doOperation(list, newNumber, minimum, maximum);
}
}
}
Вы называете это так:
List<Integer> numberList = new ArrayList<Integer>();
int min=1, max =100;
doOperation(numberList, 0, min, max);
System.out.println(numberList.toString());
РЕДАКТИРОВАТЬ:
Я перевел свой код на C ++ здесь :
#include <stdio.h>
void doOperation(int list[], int &index, int prefix, int minimum, int maximum) {
for (int i = 0; i <= 9; i++) {
int newNumber = prefix * 10 + i;
if (newNumber >= minimum && newNumber <= maximum) {
list[index++] = newNumber;
}
if (newNumber > 0 && newNumber <= maximum) {
doOperation(list, index, newNumber, minimum, maximum);
}
}
}
int main(void) {
int min=1, max =100;
int* numberList = new int[max-min+1];
int index = 0;
doOperation(numberList, index, 0, min, max);
printf("[");
for(int i=0; i<max-min+1; i++) {
printf("%d ", numberList[i]);
}
printf("]");
return 0;
}
По сути, идея такова: для каждой цифры (0-9) я добавляю ее вмассив, если он находится между minimum
и maximum
.Затем я вызываю ту же функцию с этой цифрой в качестве префикса.Он делает то же самое: для каждой цифры он добавляет его к префиксу (prefix * 10 + i
) и, если он находится между пределами, добавляет его в массив.Останавливается, когда newNumber
больше максимального.