Perl, 173
Lassen Sie mich eine weitere nutzlose Lösung hinzufügen. Diese Lösung ist so langsam, dass sie nicht einmal mehr nach der ersten seltsamen Zahl ausgeben kann. Ich wage zu sagen, es ist hier die langsamste aller Lösungen.
$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++}
Demo
Derselbe in Java geschriebene Code (mit dem ich mich besser auskenne) kann nicht einmal die 2. seltsame Nummer (836) erkennen, und ich habe die Nummer bereits direkt in die Prüfmethode eingegeben (anstatt jede Nummer zu durchlaufen und zu prüfen).
Der Kern dieser Lösung liegt in der Regex:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
Und wie der String so eingestellt ist, dass er das Dreifache der Zahl ist, die wir überprüfen.
Die Länge des Strings ist so eingestellt, dass sie das Dreifache der Zahl ist, die wir überprüfen i: Die erste 2 idient zur übereinstimmenden Summierung von Faktoren, und die letzte 1 idient zur Überprüfung, ob eine Zahl ein Faktor von ist i.
(?=(.+)\1{2}$) wird verwendet, um die Nummer zu erfassen, die wir überprüfen.
((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+stimmt mit den Faktoren der Zahl überein. Eine spätere Iteration entspricht einem kleineren Faktor als eine frühere Iteration.
- Wir können sehen, dass diese 2 Teile
(.+)und (?=.*(?=\1$)\3+$)zusammen einen Faktor der zu überprüfenden Zahl auswählen.
(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$)) Stellt sicher, dass der ausgewählte Faktor kleiner als die Zahl ist, die in der ersten Iteration überprüft wird, und kleiner als der vorherige Faktor in nachfolgenden Iterationen.
Der reguläre Ausdruck versucht, so viele Faktoren der Zahl wie möglich innerhalb der Grenze von 2 zuzuordnen i . Aber wir kümmern uns nicht um den tatsächlichen Wert der Summe der Teiler, wir kümmern uns nur darum, ob die Anzahl reichlich vorhanden ist.
Dann wird die 2. Regex, die die erste mit Regex ist, \1{2}$hinzugefügt. Infolgedessen stellt der reguläre Ausdruck sicher, dass die Summe (einiger) Faktoren der zu überprüfenden Zahl mit der Zahl selbst übereinstimmt:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+\1{2}$
Die hinzugefügte Einschränkung veranlasst die Regex-Engine, eine Rückverfolgungssuche für alle möglichen Teilmengen von Faktoren durchzuführen, sodass sie extrem langsam sein wird.