Witam, jest może ktos w stanie pomoc w jakim sposob moge zamienic pierwsza i ostatnia cyfre (oraz ogolnie jak zamieniac cyfry miejscami) jakiejs danej liczby? np. 1234 ---> 4231, Od razu mowię, że tablice odpadają bo zadanie tyczy się petli, z gory dziękuje za pomoc
Cześć @alf! Fajnie że jesteś na forum!
alf napisał(a):
Od razu mowię, że tablice odpadają bo zadanie tyczy się petli
To będzie trudne, bo większość rozwiązań jakie mi przychodzą do głowy, to rozbicie stringa na poszczególne znaki, odwrócenie tablicy, i połącznie ich z powrotem, np:
my_text = '1234'
r = ''.join(reversed(list(my_text)))
print(r)
-
list('1234')
zwraca listę znaków,['1', '2', '3', '4']
-
reverse()
zwraca iterator który iteruje wartości odwrotnie -
''.join()
łączy tablicę lub iterator separatorem (w tym wypadku pustym)
Innym wyjściem jest skorzystanie z pythonowego tricku, czyli wyciągnięcia subslice z tablicy posługując się step
= -1
. Oczywiście to jest cukier składniowy na iterację znaków od tyłu.
my_text = '1234'
r = my_test[::-1]
print(r)
> print('1234'[::-1])
'4321'
Jeśli naprawdę chcesz to zrobić bez użycia tablic z pętlą, musisz posłużyć się zmienną tymczasową, która będzie przechowywać dotychczasowy wynik podczas iteracji wstecz. To ciekawa kwestia, bo zazwyczaj iteracja wsteczna sprowadza się do użycia reversed()
albo [::-1]
, więc nawet przy użyciu pętli musiałbyś skorzystać z jednej z tych metod :laughing:. Alternatywą jest utworzenie pętli w stylu in range(4, 0, -1)
, która zwróci liczby 4
, 3
, 2
, 1
, ale to już dość przekombinowane rozwiązanie.
Szczerze mówiąc, nie wiem, kto zlecił Ci takie zadanie, ale nauka pętli na tym przykładzie nie wydaje się najlepszym pomysłem. Odwracanie kolejności to zadanie, które rozwiązują dziesiątki funkcji w Pythonie. Żeby naprawdę kogoś nauczyć pętli, warto byłoby znaleźć problem, którego rozwiązania nie ma w standardowej bibliotece Pythona. To byłoby faktycznie wartościowe, choć również dość trudne .
Jeśli chcemy koniecznie wcisnąć pętlę, to możemy to np. połączyć z rozbiciem liczby na znaki.
liczba = 1234
lancuch = str(liczba)
odwrocony_lancuch = ""
for znak in lancuch:
odwrocony_lancuch = znak + odwrocony_lancuch
odwrocona_liczba = int(odwrocony_lancuch)
print(odwrocona_liczba)
A bez zamiany na string ChatGPT zaproponował takie rozwiązanie:
def reverse_number(num):
reversed_num = 0
while num > 0:
last_digit = num % 10 # Pobierz ostatnią cyfrę
reversed_num = reversed_num * 10 + last_digit # Dodaj ostatnią cyfrę do nowej liczby
num = num // 10 # Usuń ostatnią cyfrę z oryginalnej liczby
return reversed_num
# Przykład użycia
number = 12345
reversed_number = reverse_number(number)
print(reversed_number) # Wynik: 54321
%
- modulo - reszta z dzielenia.
//
- dzielenie całkowite - zapewnia, żeby po operacji dzielenia nie zrobił się nam ułamek.
Na początek funkcja która znajduje n - tą cyfrę liczby, licząc od końca i, jak porządny informatyk, od zera (może się przydać, choć nie musi xDDD):
def find_nth_digit(number, n):
# find the nth digit of the number
while n > 0:
number //= 10
n -= 1
return number % 10
Dalej trzeba trochę pogłówkować, jak zamieniać cyfry nie korzystając z tablic. Jakby zamienić liczbę na stringa, ale string to tablica znaków, więc odpada. Liczba to liczba i nie możemy w niej zamienić cyferek miejscami, cyferki zamieniamy w napisie, czyli reprezentacji liczby. Co mi przychodzi do głowy to taka reprezentacja (do tych potęg jeszcze długość liczby jest potrzebna, ale to już trywialne):
A = 1 * 10^3 + 2 * 10^2 + 3 * 10^1 + 4 * 10 ^ 0
Wtedy zamiany cyferek będą operacjami arytmetycznymi, twój przykład:
B = (A + 3 * 10^3) - 3 * 10^0
Druga z trzecią:
C = (A + 1 * 10^2) - 1 * 10^1
Przecież to ma być zamiana pozycjy, a nie odwracanie. Dobrze rozumiem?
Tnij string
na kawałki:
# pierwsza z ostatnią
sA = "0123456789"
sF = sA[0]
sL = sA[-1]
print(sL+sA[1:-1]+sF)
# dowolna: tu 3-a z 7-ą
nF, nL = 3, 7 # może być z input(), ale trzeba sprawdzić czy nie więcej niż len(sA)
sF = sA[nF]
sL = sA[nL]
sFpart = sA[0:nF]
sMpart = sA[nF+1:nL]
sLpart = sA[nL+1:]
print(sFpart+sL+sMpart+sF+sLpart)
Pozdrawiam
Radek Głebicki
@Radosław Głębicki, No tak, sama zamiana pierwszej i ostatniej cyfry. Ale z pętlą, bez Pythonowych pomocników.
def swap_digits(num):
# Policz cyfry
digits_count = 0
tmp = num
while tmp > 0:
tmp //= 10 # Usuń ostatnią cyfrę z liczby
digits_count += 1
# Pobierz ostatnią cyfrę
last_digit = num % 10
# Pobierz pierwszą cyfrę
first_digit = num // (10**(digits_count-1))
# Usuń pierwszą cyfrę z oryginalnej liczby
num -= first_digit * (10**(digits_count-1))
# Usuń ostatnią cyfrę z oryginalnej liczby
num //= 10
# Wstaw pierwszą cyfrę na koniec liczby
num *= 10
num += first_digit
# Wstaw ostatnią cyfrę na początek liczby
num += last_digit * (10**(digits_count-1))
return num
# Przykład użycia
number = 1234
processed_number = swap_digits(number)
print(processed_number) # Wynik: 4231
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.