• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Generator liczb których suma wynosi 9

Object Storage Arubacloud
0 głosów
690 wizyt
pytanie zadane 5 stycznia 2020 w Python przez MsMaciek123 Pasjonat (24,760 p.)
zamknięte 23 stycznia 2020 przez MsMaciek123

Witam, piszę generator liczb, których suma wynosi 9 w Pythonie.
 

def sum_d(n): #suma cyfr
   r = 0
   while n:
	   r, n = r + n % 10, n // 10
   return r

liczba = 0
zaileominac = 11
coileomijac = 9
ileominac = 0
while(liczba<=2000):
    liczba += 9
    zaileominac -= 1

    if(zaileominac == 0):
        zaileominac = coileomijac
        coileomijac -= 1
        ileominac += 1
        liczba += 9*ileominac

    print(liczba)

i jest problem, ponieważ po liczbie 900, program wypisuje 999 co już jest błędne (9+9+9=27). Podejrzewam że zmienna coileomijac jest równa 0. Tylko właśnie nie wiem co mam zrobić gdy ta zmienna jest zerem.
 

810 różnica: 9
900 różnica: 90
1008 różnica: 108
1017 różnica: 9
1026 różnica: 9
1035 różnica: 9
1044 różnica: 9
1053 różnica: 9
1062 różnica: 9
1071 różnica: 9
1080 różnica: 9
1107 różnica: 27

^ tyle powinno być
mój program:
 

810 różnica: 9
900 różnica: 90
999 różnica: 99
1008 różnica: 9
1017 różnica: 9
1026 różnica: 9
1035 różnica: 9
1044 różnica: 9
1053 różnica: 9
1062 różnica: 9
1071 różnica: 9
1080 różnica: 9
1089 różnica: 9
1098 różnica: 9
1107 różnica: 9

(różnica to różnica tej cyfry i poprzedniej)
Jest ktoś wstanie mi pomóc?

komentarz zamknięcia: Poradziłem już sobie

2 odpowiedzi

0 głosów
odpowiedź 5 stycznia 2020 przez Benek Szeryf (91,110 p.)

Nie bardzo wiem, co tutaj się odjaniepawliło, ale spróbuj po prostu tak:

n = 0

for i in range(2001):
    if sum_d(i) == 9:
        print(f'{i} różnica: {i-n}')
        n = i

 

komentarz 5 stycznia 2020 przez MsMaciek123 Pasjonat (24,760 p.)

Właśnie nie chciałem używać iteracji, tylko zrobić generator wink

komentarz 5 stycznia 2020 przez Benek Szeryf (91,110 p.)
def digits_sum_nine_generator():
    for i in range(2001):
        if sum_d(i) == 9:
            yield i
gen = digits_sum_nine_generator()
next(gen)
next(gen)

 

komentarz 5 stycznia 2020 przez MsMaciek123 Pasjonat (24,760 p.)
Chodzi mi o generator w takim sensie że szybszy program, który by nie iterował tylko odrazu dawał wynik
komentarz 5 stycznia 2020 przez Benek Szeryf (91,110 p.)
Edytowałem komentarz. Teraz sprawdź, czy o to Ci chodziło.
komentarz 5 stycznia 2020 przez MsMaciek123 Pasjonat (24,760 p.)
To nadal iteruje po każdej liczbie
komentarz 5 stycznia 2020 przez Benek Szeryf (91,110 p.)
Nie, wstrzymuje iterowanie po każdym wywołaniu next i zapamiętuje bieżący stan. Napisz konkretniej, co byś chciał osiągnąć.
komentarz 6 stycznia 2020 przez MsMaciek123 Pasjonat (24,760 p.)
Żeby program nie iterował, tylko od razu dawał liczbę. Np. zauważ że liczby: 9 18 27 36 45 54 63 72 81 90 To wielokrotności liczby 9, oraz suma ich cyfr jest równa 9. I nie musiałem sprawdzać dla 1, 2, 3, 4, 5 itd. tylko po prostu wiem że wielokrotności liczby 9 do 90 to suma ich cyfr wynosi 9, jednak następną wielokrotnością jest 99, czego suma cyfr już nie jest równa 9 i nie działa to tak jak ma działać :/
komentarz 6 stycznia 2020 przez Benek Szeryf (91,110 p.)
Kod mokrowskiego zawiera to, o czym piszesz. Python raczej do najszybszych języków nie należy.
0 głosów
odpowiedź 5 stycznia 2020 przez mokrowski Mędrzec (156,140 p.)

Nie wiem czy warto się bardziej znęcać nad tym algorytmem. Jeśli wystarczająco szybkie to nie:)

#!/usr/bin/env python3

def digit_sum(value):
    sum = 0
    while value:
        sum += value % 10
        value //= 10
    return sum

def digits_sum_nine_generator(max_value):
    for value in range(9, max_value, 9):
        if digit_sum(value) == 9:
            yield value

if __name__ == '__main__':
    for value in digits_sum_nine_generator(2000):
        print(value, end=' ')

 

komentarz 6 stycznia 2020 przez MsMaciek123 Pasjonat (24,760 p.)
No właśnie nie jest wystarczająco szybkie :( dla 1000000000000
komentarz 6 stycznia 2020 przez mokrowski Mędrzec (156,140 p.)

Chciałeś generator i ten iteruje "co dziewięć". Jeśli zmienił byś wymagania, dostał byś być może lepszą wydajność.

No to podchodząc do tego "inżyniersko":

1. Oszacuj złożoność tego algorytmu (czy jest O(n^2) czy może O(n)).

2. Oszacuj czas wykonania teraz i czas akceptowalny docelowy. I... czy coś o nim wiesz? :)

3. Chciałeś generator... jeśli nie generator to będzie (nieco.. ale bez szału) szybciej.

Np. jeśli chciałbyś dostawać liczby z przedziału, to potrzebne jest niewielkie przerobienie kodu:

1. Dodanie wykrycia "1 liczby większej od podanej wartości której suma cyfr wynosi 9". To akurat jest proste i nawet naiwne rozwiązanie ma złożoność O(n). A jak się postarasz to O(1) :) Tylko przy wartości 9 i "szybkości wykonania" w języku Python, może się okazać bez większego sensu taka optymalizacja (uwaga spekuluję i oczywiście sprawdził bym).

2. Iterowanie do maksymalnej (czyli w zasadzie zmodyfikowany kod poprzedni). Wtedy będziesz miał o wiele szybciej :)

Jeśli to zadanie ze SPOJ'a lub innego tego typu serwisu, to podaj treść bo tam (czasem) dochodzą wymagania samej platformy sprawdzającej.

Podobne pytania

0 głosów
2 odpowiedzi 824 wizyt
pytanie zadane 20 marca 2019 w C i C++ przez abcd Początkujący (290 p.)
0 głosów
0 odpowiedzi 175 wizyt
pytanie zadane 10 listopada 2020 w Algorytmy przez amtrax Dyskutant (9,630 p.)

92,656 zapytań

141,546 odpowiedzi

319,987 komentarzy

62,025 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...