Jak zamienić pierwszą i ostatnią cyfrę liczby za pomocą pętli?

1

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 😀

1

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 😄.

1

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.

0

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

0

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

1

@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.