Das knackige Zahlenrätsel - Die Lösung

Worum geht es hier? Wir müssen verstehen, was die Gespräche uns für Hinweise geben. Wir müssen aus der Gesamtmenge der Zahlenpaare zwischen 2 und 100 mit jedem neuen Hinweis diejenigen entfernen, die den Anforderungen nicht mehr genügen.

Wen dieser ganze SQL-Quatsch nicht interessiert, der kann sich natürlich auch einfach nur die gesuchten Zahlen ansehen.

Vorbereitung: die Liste der Zahlenpaare

Wir erzeugen eine Tabelle mit Zahlen von 2 bis 100. Der Feldtyp identity sorgt dafür, dass SQL mit jeder Zeile, die es in der Tabelle anlegt, einen Wert weiterzählt. Was wir also als "Nutzwert" in die Tabelle schreiben, ist für uns ein nutzloser Nutzwert, deswegen nehmen wir immer Null. Könnte auch 42 sein :-)
Wir kopieren so lange den Tabelleninhalt in die Tabelle, bis durch diese Verdopplungen der Anzahl von Zeilen die Gesamtzahl mindestens 100 ist. Was zuviel ist, also größer 100, wird abgeschnitten. Außerdem fängt die identity bei 1 an zu zählen (wenn man es nicht anders spezifiziert). Deswegen löschen wir die 1 auch wieder raus.
create table Zahl (zahl int identity, nutzlos int)
insert into Zahl (nutzlos) values (0)
while (select count(1) from Zahl) < 100
	insert into Zahl (nutzlos) select nutzlos from Zahl
delete Zahl where zahl > 100
delete Zahl where zahl = 1
Man 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). Deswegen nehmen wir nicht alle Zahlenpaare in unsere Tabelle auf, sondern nur diejenigen, bei denen die zweite Zahl größer oder gleich der ersten Zahl ist.

create table Paar (X int, Y int, produkt int, summe int)
insert into Paar
select X.zahl, Y.zahl,
	X.zahl * Y.zahl,
	X.zahl + Y.zahl
from Zahl as X
inner join Zahl as Y on Y.zahl >= X.zahl
Warum wir jetzt 4950 Zeilen in der Tabelle Paar haben, kann man unter dem Stichwort Der kleine Gauß nachlesen :-)

Peter sagt zu Susanne: "ich kann die Lösung nicht nennen".

Peter kennt das Produkt zweier Zahlen zwischen 2 und 100. Er könnte die Lösung nennen, wenn es das Produkt zweier Primzahlen wäre, denn dann gibt es kein anderes Paar von ganzzahligen Faktoren.
Allgemein formuliert: Die Information, die Peter uns gibt, wenn er sagt, dass er die Lösung nicht nennen kann, ist lediglich, dass seine Zahl sich auf mehr als eine Art als das Produkt aus zwei Zahlen zwischen 2 und 100 ausdrücken lässt. Die Zahl 284 zum Beispiel ist in der Primfaktorenzerlegung 2 x 2 x 71. Sie kann aber nur als 4 x 71 durch zwei Zahlen zwischen 2 und 100 ausgedrückt werden, denn in der Form 2 x 142 ist der zweite Faktor größer als 100.

Wir suchen also nach der Menge der Produkte, die in der Auflistung aller Produkte aus zwei Zahlen zwischen 2 und 100 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 produkt
Die gute Nachricht: es gibt jetzt nur noch 1087 mögliche Produkte mit 3157 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)

Zurück zum Rätsel - Weiter zu Schritt 2