Perl, 173
Permettez-moi d'ajouter une autre solution inutile. Cette solution est si lente qu'elle ne peut même pas sortir quoi que ce soit après le premier nombre étrange. J'ose dire que c'est la solution la plus lente de toutes ici.
$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++}
Démo
Le même code écrit en Java (avec lequel je suis plus à l'aise) ne peut même pas reconnaître le 2ème numéro bizarre (836), et j'ai déjà alimenté le numéro directement dans la méthode de vérification (au lieu de boucler et de vérifier chaque numéro).
Le cœur de cette solution réside dans l'expression rationnelle:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
Et comment la chaîne est configurée pour être 3 fois le nombre que nous vérifions.
La longueur de la chaîne est configurée pour être 3 fois le nombre que nous vérifions i: les 2 premiers servent ià faire correspondre la somme des facteurs et le dernier 1 iest réservé pour vérifier si un nombre est un facteur de i.
(?=(.+)\1{2}$) est utilisé pour capturer le nombre que nous vérifions.
((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+correspond aux facteurs du nombre. Une itération ultérieure correspondra à un facteur plus petit qu'une itération antérieure.
- Nous pouvons voir que ces 2 parties
(.+)et (?=.*(?=\1$)\3+$)ensemble sélectionnent un facteur du nombre vérifié.
(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$)) s'assure que le facteur sélectionné est plus petit que le nombre vérifié lors de la première itération, et est plus petit que le facteur précédent dans les itérations suivantes.
L'expression régulière essaie de faire correspondre autant de facteurs du nombre que possible dans la limite de 2 i. Mais nous ne nous soucions pas de la valeur réelle de la somme des diviseurs, nous nous soucions seulement de savoir si le nombre est abondant.
Ensuite, le 2e regex, qui est le premier regex avec \1{2}$ajouté. Par conséquent, l'expression régulière s'assure que la somme de (certains) facteurs du nombre contrôlé est égale au nombre lui-même:
^(?=(.+)\1{2}$)((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+\1{2}$
La contrainte ajoutée obligera le moteur d'expression régulière à effectuer une recherche de retour arrière sur tous les sous-ensembles possibles de facteurs, donc cela va être extrêmement lent.