Dobrý den, potřeboval bych pomoct s úlohou: Je dána posloupnost celých kladných čísel zakončena libovolným záporným číslem. Určete, kolik je v ní lichých čísel dělitelných třemi.
přišel jsem akorát na to, aby mi to vypsalo lichá čísla dělitelná třemi, ale nevím, jak udělat, aby to fungovalo jen do té doby, dokud tam je kladné číslo a záporným číslem by byl program ukončen a vypsal by se mi počet těch lichých čísel dělitelných třemi. Děkuju za pomoc.
seznam=[1,5,6,9,8,21,-71]
for i in seznam:
if i%3==0 and i%2!=0:
print (i)
#4peter
jde mu pouze o kladná čísla, záporné číslo ukončuje cyklus.
S těmi bitovými operacemi můžeš a nemusíš mít pravdu i&1=1 nebo i%2!=0, je to otázka, bo pokud má Python dobrou optimalizaci, tak /2 se dá udělat rotací 1 doprava a bit 0 se projeví v příznaku stavového registru a pak už jen podmínka na příznak. takže to vyjde skoro nastejno, jen i testu bitu se ušetří 1 instrukce na zpětnou rotaci (aby se vrátila hodnota I na původní), ale vzhledem k tomu jak to má řešený to nemusí být nutné - pokud není liché jde se na další číslo. Jde opravdu hlavně o to, jak python zpracuje program.
Např. Delphi MODulo 2 optimalizuje u 32bitového znaménkového INTu na AND $80000001 (hex) tím by měli být ošetřená i záporná čísla.
from itertools import takewhile
cisla = 1,2,5,6,2,9,5,5,8,-6,5,5,26,-5
vyber = sum(1 for i in takewhile(lambda x: x>=0, cisla) if not i%3)
assert vyber == 2, "test"
#5MilanL
Tezko rici. Ve vyssich jazycich je bohuzel problem pracovat s jednim bitem. Musi se to vselijak vyahovat pres OR a tak. Ale v ASM bych sel do bitu a at si s tim poradi prekladac :)
#7Simon5
Není zač, jen jsem si všiml, že je tam chyba. Vrátí to součet všech čísel dělitelných třemi, nejen lichých. Musíš si ještě upravit podmínku na konci.
Co se týče tvrzení o rychlosti za pomoci bitových operací, tím bych si nelámal hlavu. V Pythonu to vyjde na stejno, ne-li hůř. Ve skutečnosti je v mém Pythonu zjišťování lichého čísla pomocí metody uvedené nahoře 1,25 x pomalejší než verze s modulem %.
from timeit import timeit
number = 20
cas_m = timeit("sum(1 for i in range(10**6) if i%2)", number=number)
print("Modulo: %ss" % cas_m)
cas_b = timeit("sum(1 for i in range(10**6) if i&1)", number=number)
print("Bity: %ss" % cas_b)
print("Modulo je v Pythonu %s x rychlejší než bitové operace." % (cas_b / cas_m))