

Ich kenn' inzwischen die Lösung und habe den Weg dahin "nachvollzogen": von trivial kann keine Rede sein!Also entweder gibt es einen ganz banalen Lösungsansatz, oder das Ding hat es wirklich verdammt in sich.
Gruß,
Hagge
Code: Alles auswählen
/* Denksportaufgabe:
Gesucht sind zwei ganze Zahlen, die größer als 1 und kleiner als 100 sind.
Peter kennt das Produkt der beiden Zahlen und Stefan die Summe. Nachdem
beide einige Zeit gegrübelt haben, entwickelt sich der folgende Dialog:
Peter: "Ich kenne die beiden Zahlen nicht."
Stefan: "Ich kenne die beiden Zahlen auch nicht, ich wusste aber, dass Du
sie nicht kennst."
Peter: "Dann kenne ich die beiden Zahlen jetzt."
Stefan: "Dann kenne ich die beiden Zahlen jetzt auch."
Welches sind die beiden Zahlen?
*/
#include <stdio.h>
#define PRINTF(fmt, args...) if (verbose) printf(fmt, ## args)
int verbose = 0;
/* Aussage 1: "Peter weiß es nicht."
Es gibt mehr als eine Produktzerlegung */
int PeterWeissEsNicht(int prod)
{
int z1, z2;
int n=0;
PRINTF("(A1) Produkt %i:", prod);
for (z1=2; z1<100; z1++)
{
for (z2=z1+1; z2<100; z2++)
{
if (z1*z2 == prod)
{
PRINTF(" %i*%i", z1, z2);
n++;
}
}
}
if (n>1)
{
PRINTF(" -> Peter weiss es nicht (A1 wahr)\n");
return 1;
}
PRINTF(" -> Peter weiss es (A1 falsch)\n");
return 0;
}
/* Aussage 2: "Stefan weiß es nicht, weiß aber, dass es Peter nicht weiß."
Es gibt mehr als eine Summenzerlegung und für jede Summenzerlegung gilt,
dass Peter es für diese Zahlenkombination nicht weiß. */
int StefanWeissEsNichtUndWeissDassPeterEsNichtWeiss(int sum)
{
int z1, z2;
int n = 0;
int p = 1;
PRINTF(" (A2) Summe %i:\n", sum);
for (z1=2; z1<100; z1++)
{
for (z2=z1+1; z2<100; z2++)
{
if (z1+z2 == sum)
{
n++;
PRINTF(" %i+%i: ", z1, z2);
if (!PeterWeissEsNicht(z1*z2))
{
p = 0;
}
}
}
}
if ((n>1) /* Bei n==1 wüsste es Stefan */
&& (p == 1)) /* Bei p==0 wusste es Peter */
{
PRINTF(" -> Stefan weiss es nicht und weiss, dass Peter es nicht weiss (A2 wahr)\n");
return 1;
}
PRINTF(" -> Stefan weiss es oder Peter weiss es (A2 falsch)\n");
return 0;
}
/* Aussage 3: "Peter weiß es jetzt."
Genau eine Produktzerlegung führt, als Summe gesehen, zu Aussage 2 */
int PeterWeissEsJetzt(int prod)
{
int z1, z2;
int save1=0, save2=0;
int n=0;
PRINTF(" (A3) Produkt %i:\n", prod);
for (z1=2; z1<100; z1++)
{
for (z2=z1+1; z2<100; z2++)
{
if (z1*z2 == prod)
{
PRINTF(" zerlegt in %i*%i:\n", z1, z2);
if (StefanWeissEsNichtUndWeissDassPeterEsNichtWeiss(z1+z2))
{
n++;
save1 = z1;
save2 = z2;
}
}
}
}
if (n==1)
{
PRINTF(" -> Peter weiss es jetzt (A3 wahr, denkt es ist %i und %i)\n", save1, save2);
return 1;
}
PRINTF(" -> Peter weiss es immer noch nicht (A3 falsch, Stefan kann seine Aussage 2 in mehreren Varianten halten)\n");
return 0;
}
/* Aussage 4: "Stefan weiß es jetzt auch."
Genau eine Kombination der Summenzerlegungen führt zu Aussage 3 */
int StefanWeissEsJetztAuch(int sum)
{
int z1, z2;
int save1=0, save2=0;
int n = 0;
PRINTF("(A4) Summe %i:\n[\n", sum);
for (z1=2; z1<100; z1++)
{
for (z2=z1+1; z2<100; z2++)
{
if (z1+z2 == sum)
{
PRINTF(" zerlegt in %i+%i:\n", z1, z2);
if (PeterWeissEsJetzt(z1*z2))
{
n++;
save1 = z1;
save2 = z2;
}
PRINTF("\n");
}
}
}
PRINTF("]");
if (n==1)
{
PRINTF(" -> Stefan weiss es jetzt auch (A4 wahr, denkt es ist %i und %i)\n", save1, save2);
return 1;
}
PRINTF(" -> Stefan weiss es trotzdem nicht (A4 falsch, bei mehreren Varianten weiss es Peter)\n");
return 0;
}
int main(int argc, char *argv[])
{
int z1, z2;
int n = 0;
if (argc > 1)
verbose = 1;
for (z1=2; z1<100; z1++)
{
for (z2=z1+1; z2<100; z2++)
{
PRINTF("-- %i und %i --\n", z1, z2);
if (PeterWeissEsNicht(z1*z2)
&& StefanWeissEsNichtUndWeissDassPeterEsNichtWeiss(z1+z2)
&& PeterWeissEsJetzt(z1*z2)
&& StefanWeissEsJetztAuch(z1+z2))
{
printf("==> %i und %i sind eine Loesung!!!\n", z1, z2);
n++;
}
PRINTF("\n");
}
}
printf("\nEs gibt %i Loesung(en)\n", n);
return 0;
}
TV-Junkie hat geschrieben:Wenn ich Peter wäre, hätte mir ja auch die 81 als Produkt genannt werden können.
Code: Alles auswählen
int isprim(int x)
{
return (x==2) || (x==3) || (x==5) || (x==7) || ((x%2) && (x%3) && (x%5) && (x%7));
}
[quote="hagge"]Warum macht eigentlich das code-Element immer so viele unnötige Leerzeilen ans Ende des Codes?[/quote]
hagge hat geschrieben:@ewgh
Dein Link von gestern tut heute nicht mehr! Der hier tut besser.
Edit: ne, der tut auch nicht, wenn man ihn anklickt. Aber wenn ihn in die Adresszeile des Browsers kopiert, sollte es gehen.
Gruß,
Hagge
TV-Junkie hat geschrieben:Könnte mir das trotzdem jemand erklären, wie z.B. einen von mir aus achtklässler![]()
ewgh hat geschrieben:@TV-Junkie:
Das ist auch nicht der "Stoff" aus dem Abiturienten gemacht sind! Solche "Untersuchungen" entstammen zahlentheoretischen Spielereien mathematisch überhöhter Gehirne!
Im Prinzip hat das nichts mehr mit "Kleiner Denksport" zu tun!