• 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

42 Warsaw Coding Academy
0 głosów
1,123 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 (93,070 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 (93,070 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 (93,070 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 (93,070 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 (93,070 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 (158,440 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 (158,440 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 991 wizyt
pytanie zadane 20 marca 2019 w C i C++ przez abcd Początkujący (290 p.)
0 głosów
0 odpowiedzi 352 wizyt
pytanie zadane 10 listopada 2020 w Algorytmy przez amtrax Dyskutant (9,630 p.)
–2 głosów
0 odpowiedzi 292 wizyt

93,398 zapytań

142,390 odpowiedzi

322,576 komentarzy

62,756 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...