Wen dieser ganze SQL-Quatsch nicht interessiert, der kann sich natürlich auch einfach nur die gesuchten Zahlen ansehen.
create table Zahl (zahl int identity, nutzlos int) insert into Zahl (nutzlos) values (0) while (select count(1) from Zahl) < 1000 insert into Zahl (nutzlos) select nutzlos from Zahl delete Zahl where zahl > 1000Man möge mir verzeihen, dass ich SQL-Keywords klein schreibe. Ein ANSI SQL Parser verzeiht mir das. Unter echten Datenbank-Programmieren ist es freilich verpönt, aber wir wollen hier ja in erster Linie ein Rätsel lösen und nicht programmieren.
Jetzt haben wir eine Tabelle mit Zahlen. Wir wollen eine Tabelle mit Faktoren Schrägstrich Summanden,
nämlich eine Tabelle mit Zahlenpaaren. Sowohl die Multiplikation als auch die Addition sind
kommutativ - das Zahlenpaar (X, Y) ist
für unsere Lösung identisch zu (Y, X). Zwar ist die Subtraktion nicht kommutativ, doch wenn man die
Angaben studiert, dann wird nirgends erwähnt, welche der beiden Differenzen
der zwei Zahlen (die Positive oder die Negative)
Daniel verraten wird. Deswegen ist offensichtlich nur der Betrag der Differenz interessant.
Wir nehmen also nicht alle Zahlenpaare in unsere
Tabelle auf, sondern nur diejenigen, bei denen die zweite Zahl größer oder gleich der ersten Zahl ist.
Dieses Statement kann durchaus ein paar Minütchen brauchen ...
create table Paar (X int, Y int, produkt int, summe int, differenz int) insert into Paar select X.zahl, Y.zahl, X.zahl * Y.zahl, X.zahl + Y.zahl, Y.zahl - X.zahl from Zahl as X inner join Zahl as Y on Y.zahl >= X.zahlWarum wir jetzt genau 500500 Zeilen in der Tabelle Paar haben, kann man unter dem Stichwort Der kleine Gauß nachlesen :-)
Wir suchen nach der Menge der Produkte, die in der Auflistung aller Produkte aus zwei Zahlen zwischen 1 und 1000 mehrfach auftauchen. Wir erzeugen dazu eine Tabelle der Produkte und zählen, wie viele Faktorenpaare jedes Produkt ergeben.
create table Produkt (produkt int, anzahl int) insert into Produkt select produkt, count(1) from Paar group by produktDie gute Nachricht: es gibt jetzt nur noch 103360 mögliche Produkte mit lumpigen 355777 denkbaren Kombinationen von Faktoren. Hurra!
select count(distinct produkt) as Produkte, count(1) as Kombinationen from Paar where produkt in (select produkt from Produkt where anzahl > 1)