Autorské riešenie
Ako prvé riešenie, ktoré nás hneď napadne, je prechádzať všetkými n-cifernými číslami a zisťovať, ktoré z nich majú rovnaký zápis spredu aj zozadu a zároveň sú deliteľné 11. Požadovaná funkcia generuj() môže vyzerať napr. nasledovne: def generuj(pocet_cifier):
if pocet_cifier == 1: return [0] elif pocet_cifier < 1: return [] vysledok = [] prve = 10 ** (pocet_cifier - 1) posledne = 10 * prve - 1 for pocitadlo in range(prve, posledne + 1): if str(pocitadlo) == str(pocitadlo)[::-1] and pocitadlo % 11 == 0: vysledok.append(pocitadlo) return vysledok V uvedenej funkcii sme očetrili hraničné prípady, keď počet cifier je rovný 1 a tiež ak počet cifier je menší ako 1. Toto riešenie nie je efektívne, lebo prechádzame zbytočne všetkými n-cifernými číslami. Ak číslo má zapis rovnaky spredu a zozadu, stačí prejsť všetky možné čísla s polovičným počtom cifier a druhu polovicu čísla len prevrátime a pripíšeme. V prípade nepárneho počtu cifier dopočítame prostrednú cifru. Funkcia generuj() naprogramovaná pomocou tohto prístupu môže vyzerať nasledovne: def generuj(pocet_cifier):
if pocet_cifier == 1: return [0] elif pocet_cifier < 1: return [] vysledok = [] prve = 10 ** (pocet_cifier // 2 - 1) posledne = 10 * prve - 1 for pocitadlo in range(prve, posledne + 1): cast_lava = str(pocitadlo) cast_prava = str(pocitadlo)[::-1] if pocet_cifier % 2 == 0: vysledok.append(int(cast_lava + cast_prava)) else: if len(cast_lava) % 2 != 0: stred = int(cast_lava + str(0) + cast_prava) % 11 else: stred = (11 - int(cast_lava + str(0) + cast_prava) % 11) % 11 if stred != 10: vysledok.append(int(cast_lava + str(stred) + cast_prava)) return vysledok Pri výpočte prostrednej číslice pri nepárnom počte cifier treba ešte rozlíšiť dva prípady - ak je počet cifier prvej časti nepárny a ak je počet párny. Napr. v čísle 121 sme dopočítali prostrednú cifru 2, ale pri čísle 10901 sme dopočítali prostrednú cifru 9. Pre lepšiu predstavu porovnania neefektívneho prvého riešenia s druhý riešení môžeme uviesť niekoľko faktov:
Táto úloha je zameraná na:
Vaše zaujímavé riešenia a najčastejšie chyby Do riešenia úlohy sa zapojilo 27 tímov z kategórie GURU. Plný počet bodov za svoje riešenie dosiahli 3 tímy oliverseman, sigma a cestoviny bez posypky s posypkou, ktorým srdečne gratulujeme. V riešeniach sme zaregistrovali nasledovné nedostatky, vychádzajúce najčastejšie z nedôslednej analýzy problému:
|
||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |