streamlit-delta-PUU-calculator/pages/evklidov-algoritem.py
2026-01-08 12:47:42 +01:00

68 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import streamlit as st
st.set_page_config(page_title="Evklidov algoritem", page_icon="🧮")
st.title("🧮 Evklidov algoritem za izračun NSD")
st.markdown("""
### Kaj je Evklidov algoritem?
Evklidov algoritem je starodaven in zelo učinkovit postopek za iskanje **največjega skupnega delitelja (NSD)** dveh naravnih števil.
Temelji na dejstvu, da je NSD(a, b) enak NSD(b, ostanek pri a ÷ b), dokler ostanek ni 0.
""")
st.info("Vnesi dve pozitivni celi števili in aplikacija bo pokazala vse korake algoritma ter rezultat.")
# Vnos števil
col1, col2 = st.columns(2)
with col1:
a = st.number_input("Prvo število (a)", min_value=1, value=64000000, step=1)
with col2:
b = st.number_input("Drugo število (b)", min_value=1, value=360000, step=1)
if st.button("🚀 Izračunaj NSD", type="primary"):
# Kopija za prikaz
original_a, original_b = a, b
# Zagotovimo, da je a večje ali enako b
num1, num2 = a, b
steps = []
step = 1
if num1 < num2:
num1, num2 = num2, num1
steps.append(f"🔄 Zamenjava: večje število je {num1}, manjše {num2}")
while num2 != 0:
quotient = num1 // num2
remainder = num1 % num2
steps.append(f"**Korak {step}:** {num1} ÷ {num2} = {quotient} (celo število)")
steps.append(f" Ostanek: {num1} - {quotient} × {num2} = **{remainder}**")
steps.append(f" → NSD({num1}, {num2}) = NSD({num2}, {remainder})")
steps.append("") # prazen prostor
num1, num2 = num2, remainder
step += 1
nsd = num1
# Izpis rezultata
st.success(f"🎉 Največji skupni delitelj (NSD) števil {original_a} in {original_b} je: **{nsd}**")
# Prikaz korakov
st.markdown("### 📋 Koraki Evklidovega algoritma:")
for s in steps:
st.markdown(s)
st.markdown(f"**Končni rezultat:** Ostanek je 0 → NSD = **{nsd}**")
# Bonus: okrajšanje ulomka
st.markdown("### 🎁 Bonus: Okrajšanje ulomka a / b")
if original_b % nsd == 0 and original_a % nsd == 0:
okrajsan_st = original_a // nsd
okrajsan_im = original_b // nsd
st.latex(f"\\dfrac{{{original_a}}}{{{original_b}}} = \\dfrac{{{okrajsan_st}}}{{{okrajsan_im}}}")
if okrajsan_im == 1:
st.info(f"Ulomek se okrajša na celo število: **{okrajsan_st}**")
else:
st.warning("Napaka pri okrajšavi to se ne bi smelo zgoditi.")
st.caption("Izdelal z ❤️ za učenje matematike | Streamlit + Evklid (okoli 300 pr. n. št.)")