68 lines
2.5 KiB
Python
68 lines
2.5 KiB
Python
|
|
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.)")
|