1. Erste Version: JAVA, Gunnar Hage


/**
* ACM programming Contest WS 08/09 "640 - Self Numbers"
* Accepted Run Time 0.900
* Gunnar Hage, AP5(IFB5A) Okt. 2008
*
* Die Aufgabe ist, alle "Self Numbers" zwischen 0 und 1000001 auszugeben.
* Eine Self Number ist eine Zahl r für die gilt r = n + Quersumme(n). n wird dabei
* als der Generator von r bezeichnet.
*/

public class Main {
public static void main(String[] args) {
int n=0, l=0, g=1;
//g generator
//
boolean[] istSelfNumber = new boolean[1000070];

//Erzeugt für alle Generatoren von 1 bis 1.000.000 die Self Numbers und setzt die entsprechenden Flag im Array true.
while(g<=1000000){
n = l = g;
while(l>9){ // 9 statt 0 spart eine Modulo- und Divisionsrechung pro Zahl
n = n+l%10;
l = l/10;
}
n = n+l; //die letzte Stelle Addieren
istSelfNumber[n] = true;
g++;
}

//Die Ausgabe ist der eigentliche Trick. Weil knapp 1.000.000 print statements zu lang dauern, gebe ich
//alle Self Numbers in 1000 der Blöcken aus.
String print = "";
for(g=1;g<1000000;g+=1000){
for(n=g; n<g+1000;n++)
if(!istSelfNumber[n])
print = print + n +"\n";
System.out.print(print);
print="";
}
}
}