Конечно, псевдокод, так как он пахнет домашней работой: -)
def findNum (n):
testnum = n
while testnum <= 1000:
tempnum = testnum
sum = 0
while tempnum > 0:
sum = sum + (tempnum mod 10)
tempnum = int (tempnum / 10)
if sum == n:
return testnum
testnum = testnum + n
return -1
Это занимает около 15 тысячных секунды, когда переводится на Python так хорошо под вашим двухсекундным порогом. Он работает, в основном, проверяя каждое кратное N
меньше или равное 1000.
Тест проходит через каждую цифру числа, добавляя ее к сумме, затем, если эта сумма соответствует N
, она возвращает число. Если число нет соответствует, оно возвращает -1.
В качестве тестовых случаев я использовал:
n findNum(n) Justification
== ========== =============
1 1 1 = 1 * 1, 1 = 1
10 190 190 = 19 * 10, 10 = 1 + 9 + 0
13 247 247 = 13 * 19, 13 = 2 + 4 + 7
17 476 476 = 17 * 28, 17 = 4 + 7 + 6
99 -1 none needed
Теперь, когда проверяется только число, кратное 1000, в отличие от проверки всех чисел, но проверка всех чисел начинает занимать намного больше двух секунд, независимо от того, какой язык вы используете. Вы можете найти более быстрый алгоритм, но я бы хотел предложить кое-что еще.
Вероятно, вы не найдете более быстрого алгоритма, чем тот, который требуется для простого просмотра значений в таблице. Итак, я бы просто запустил программу один раз , чтобы сгенерировать вывод в соответствии с:
int numberDesired[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
190, 209, 48, 247, 266, 195, 448, 476, 198, 874,
...
-1, -1};
, а затем просто подключите его к новой программе, чтобы он мог использовать ослепительно быстрый поиск.
Например, вы можете сделать это с помощью некоторого Python, например:
print "int numberDesired[] = {"
for i in range (0, 10):
s = " /* %4d-%4d */"%(i*10,i*10+9)
for j in range (0, 10):
s = "%s %d,"%(s,findNum(i*10+j))
print s
print "};"
, который генерирует:
int numberDesired[] = {
/* 0- 9 */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
/* 10- 19 */ 190, 209, 48, 247, 266, 195, 448, 476, 198, 874,
/* 20- 29 */ 3980, 399, 2398, 1679, 888, 4975, 1898, 999, 7588, 4988,
/* 30- 39 */ 39990, 8959, 17888, 42999, 28798, 57995, 29988, 37999, 59888, 49998,
/* 40- 49 */ 699880, 177899, 88998, 99889, 479996, 499995, 589996, 686999, 699888, 788998,
/* 50- 59 */ 9999950, 889899, 1989988, 2989889, 1999998, 60989995, 7979888, 5899899, 8988898, 8888999,
/* 60- 69 */ 79999980, 9998998, 19999898, 19899999, 59989888, 69999995, 67999998, 58999999, 99899888, 79899999,
:
};
Это займет намного больше времени, чем две секунды, но вот в чем дело: вам нужно только запустить его один раз, а затем вырезать и вставить таблицу в ваш код. Если у вас есть таблица, она, скорее всего, сметет любое алгоритмическое решение.