Быстрее, возможно, нет (но вы должны все равно измерить, на всякий случай - моя мантра оптимизации - "measure, don't guess"
). Но я думаю, что яснее в намерениях, и способен обрабатывать целые числа произвольного размера.
int hasDupes (unsigned int n) {
// Flag to indicate digit has been used.
int i, used[10];
// Must have dupes if more than ten digits.
if (n > 9999999999)
return 1;
// Initialise dupe flags to false.
for (i = 0; i < 10; i++)
used[i] = 0;
// Process all digits in number.
while (n != 0) {
// Already used? Return true.
if (used[n%10]) // you can cache n%10 if compiler not too smart.
return 1;
// Otherwise, mark used, go to next digit.
used[n%10] = 1; // and you would use cached value here.
n /= 10;
}
// No dupes, return false.
return 0;
}
Если у вас ограниченный диапазон возможностей, вы можете использовать проверенный временем подход, заключающийся в том, чтобы жертвовать пространством ради времени.
Допустим, вы говорите о числах от 0 до 999:
const int *hasDupes = {
// 0 1 2 3 4 5 6 7 8 9
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // x
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
0, 0, 1, 0, 0, 0, 0, 0, 0, 0, // 2x
:
0, 0, 0, 0, 0, 0, 0, 1, 0, 1, // 97x
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, // 98x
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 99x
};
и просто выполните поиск по таблице hasDupes[n]
.
Исходя из ваших правок, когда вам нужно обработать девять цифр, массив из миллиарда элементов (второе решение выше), вероятно, будет невозможен для вашего калькулятора: -)
Я бы выбрал первое решение.