UPN umgekehrte polnische Notation

Zum Geburtstag habe ich einige Denkaufgaben bekommen. Die interessanteste davon:
Wie viele 5-stellige Zahlen der Form A18AA gibt es , die durch 18 teilbar sind?
Als erstes wollte ich ein BASIC Programm schreiben, aber sobald der Divisor für den MOD Operator eine bestimmte Größe erreicht, gibt der Interpreter die Fehlermeldung overflow aus.
Auf meinem HP 48 Rechner ist es mir dann gelungen ein entsprechendes Programm in der Sprache UPN zu schreiben. Es war aufwendig, weil ich lange nichts mehr auf den alten HP Rechnern programmiert hatte.
Das Programm ergibt das Ergebnis 1. Da meine “for…next” Schleife aber von 1 bis 9 geht und weil auch für A=0 die Zahl der Teilbarkeit genügt, denke ich dass 2 richtig ist.
Wenn jemand von euch Lust hat, so etwas in einer neueren Sprache zu programmieren (c++ oder Python) würde es mich interessieren wie die Syntax aussieht. Eine “for … next” Schleife und eine “if … then” Verzweigung müsste es eigentlich in jeder Sprache geben.
Grüsse aus Terlan
Hans

in python würde ich es so schreiben:

erg = []
for i in range (1800, 101800,10011):
	if i % 18 == 0:
		erg.append(i)
print("Anzahl = {}, Werte: {}".format(len(erg),erg))

liefert
Anzahl = 2, Werte: [1800, 61866]

update:

Wer sagt, dass A nur einstellig sein darf?

Das Ergebnis für A < 1000:

time upn.py
Anzahl = 167, Werte: [1800, 61866, 12181212, 18181818, 24182424, 30183030, 36183636, 42184242, 48184848, 54185454, 60186060, 66186666, 72187272, 78187878, 84188484, 90189090, 96189696, 10218102102, 10818108108, 11418114114, 12018120120, 12618126126, 13218132132, 13818138138, 14418144144, 15018150150, 15618156156, 16218162162, 16818168168, 17418174174, 18018180180, 18618186186, 19218192192, 19818198198, 20418204204, 21018210210, 21618216216, 22218222222, 22818228228, 23418234234, 24018240240, 24618246246, 25218252252, 25818258258, 26418264264, 27018270270, 27618276276, 28218282282, 28818288288, 29418294294, 30018300300, 30618306306, 31218312312, 31818318318, 32418324324, 33018330330, 33618336336, 34218342342, 34818348348, 35418354354, 36018360360, 36618366366, 37218372372, 37818378378, 38418384384, 39018390390, 39618396396, 40218402402, 40818408408, 41418414414, 42018420420, 42618426426, 43218432432, 43818438438, 44418444444, 45018450450, 45618456456, 46218462462, 46818468468, 47418474474, 48018480480, 48618486486, 49218492492, 49818498498, 50418504504, 51018510510, 51618516516, 52218522522, 52818528528, 53418534534, 54018540540, 54618546546, 55218552552, 55818558558, 56418564564, 57018570570, 57618576576, 58218582582, 58818588588, 59418594594, 60018600600, 60618606606, 61218612612, 61818618618, 62418624624, 63018630630, 63618636636, 64218642642, 64818648648, 65418654654, 66018660660, 66618666666, 67218672672, 67818678678, 68418684684, 69018690690, 69618696696, 70218702702, 70818708708, 71418714714, 72018720720, 72618726726, 73218732732, 73818738738, 74418744744, 75018750750, 75618756756, 76218762762, 76818768768, 77418774774, 78018780780, 78618786786, 79218792792, 79818798798, 80418804804, 81018810810, 81618816816, 82218822822, 82818828828, 83418834834, 84018840840, 84618846846, 85218852852, 85818858858, 86418864864, 87018870870, 87618876876, 88218882882, 88818888888, 89418894894, 90018900900, 90618906906, 91218912912, 91818918918, 92418924924, 93018930930, 93618936936, 94218942942, 94818948948, 95418954954, 96018960960, 96618966966, 97218972972, 97818978978, 98418984984, 99018990990, 99618996996]

real	0m0,044s
user	0m0,017s
sys	0m0,027s

Hallo @hans ,
der Spender des Rätsels hat sich einen richtigen Scherz erlaubt und uns beide zum Programmieren verleitet, obwohl das Problem mit ein paar Überlegungen und Kopfrechnen selbst für ganz große Werte von A leicht lösbar ist.

Wann ist eine Zahl ohne Rest durch 18 teilbar?

  • Wenn sie durch 9 teilbar und gerade ist.
  • Eine Zahl ist durch 9 teilbar, wenn die Quersumme durch 9 teilbar ist.
  • Weil A im Muster ‘A18AA’ 3 mal vorkommt, ist die Teilbarkeit genau dann gegeben, wenn A durch 6 teilbar ist.

Wie viele Zahlen der Form ‘A18AA’ sind im Bereich von A=1 bis A=n durch 18 teilbar?

Lösung: Ganzzahliger Anteil von n/6

  • für n= 10: n/6=1,6666
  • für n= 100: n/6=16,666
  • für n=1000: n/6=166,66
  • und so weiter
  • also allgemein für n=10 hoch k : 1,6666 * 10 hoch (k-1)

Wenn A=0 auch möglich sein soll, ist die Anzahl um 1 zu erhöhen.

1 Like

Hallo Franz,
auf die Möglichkeit mit der Quersumme wäre ich nicht so schnell gekommen, das obwohl in meiner Schulzeit die 9-er Probe eine gängige Methode war um Rechnungen zu prüfen.
Dein Python Programm ist auch viel kürzer als meines in UPN. Der MOD Operator wird mit % aufgerufen, wie ich sehen kann. // ergibt den ganzzahligen Teil, wie ich beim Blättern im Buch von Michael Kofler gefunden habe. Einmal hatte ich auch vor Python zu lernen, aber mit 87 schaffe ich das wohl nicht mehr.
Danke für Deine Mühe!
Grüsse aus Terlan
Hans