Perl, 173
Позвольте мне добавить еще одно бесполезное решение. Это решение настолько медленное, что даже после первого странного числа оно не может вывести ничего. Смею сказать, что это самое медленное из всех решений здесь.
$n=<>;$i=2;while($n){$b=qr/^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+/;$_='x'x3x$i;if(/$b/&&($+[0]>$i)&&!/$b\1{2}$/){print"$i\n";$n--}$i++}
демонстрация
Тот же код, написанный на Java (с которым мне удобнее), даже не может распознать 2-е странное число (836), и я уже передал число непосредственно методу проверки (вместо зацикливания и проверки каждого числа).
Суть этого решения заключается в регулярном выражении:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
И как строка установлена, чтобы быть в 3 раза больше числа, которое мы проверяем.
Длина строки установлена в 3 раза больше числа, которое мы проверяем i: первые 2 iпредназначены для совпадения суммирования факторов, а последние 1 iзарезервированы для проверки, является ли число фактором i.
(?=(.+)\1{2}$) используется для захвата номера, который мы проверяем.
((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+соответствует коэффициентам числа. Более поздняя итерация будет соответствовать меньшему коэффициенту, чем более ранняя итерация.
- Мы видим, что эти 2 части
(.+)и (?=.*(?=\1$)\3+$)вместе выбирают коэффициент проверяемого числа.
(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$)) гарантирует, что выбранный коэффициент меньше, чем число, проверяемое в первой итерации, и меньше, чем предыдущий фактор в последующих итерациях.
Регулярное выражение пытается сопоставить как можно больше факторов числа в пределах 2 i. Но мы не заботимся о фактическом значении суммы делителей, мы заботимся только о том, является ли число обильным.
Затем второе регулярное выражение, которое является первым регулярным выражением с \1{2}$добавленным. В результате регулярное выражение проверяет, что сумма (некоторых) факторов проверяемого числа равна самому числу:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+\1{2}$
Добавленное ограничение заставит механизм регулярных выражений выполнять поиск в обратном направлении по всем возможным подмножествам факторов, поэтому он будет очень медленным.