Dati due estremi, stampare tutti i quadrati perfetti.

Dati due estremi come numeri interi, non necessariamente ordinati, stampare a video tutti i quadrati perfetti compresi gli estremi. Es. estremi 64 e 123, i quadrati da stampare sono 64, 81, 100, 121. Vediamo come realizzarlo in python.

L'esercizio è un classico esempio assegnato agli alunni alle prime armi con la programmazione. Qui lo vediamo in python, ma con poco impegno può essere trascritto anche in c++ o altro linguaggio.

Il primo ragionamento da fare è sugli estremi. Il testo, quasi a tranello, indica che i due estremi possono essere inseriti in qualsiasi ordine. Per praticità, conviene riordinarli con il più semplice e classico dei sistemi che ogni studente di informatica deve conoscere alla perfezione e saper utilizzare. Letti i due numeri in due variabili a e b, opportunamente trattate con la funzione eval, scambio i due numeri nel caso il secondo sia più piccolo del primo. Per fare lo scambio ci occorre una terza variabilie che qui chiamiamo tmp.

a = eval(input("Inserisci numero a ")) 
b = eval(input("Inserisci numero b "))  

#mi assicuro che a sia più piccolo di b
if b < a:
    tmp = a
    a = b
    b = tmp

 

Assicuratici degli estremi, non ci resta che usarli per creare un ciclo. Qui nel codice riportiamo un ciclo for e la clausola in range, ma poteva essere usato anche un normale ciclo while. Tutti gli elementi che scorro, vengono copiati nella variabile numero su cui possiamo andare a fare le nostre considerazioni se trattasi di numero quadrato o no. Premesso che non c'pè un solo modo per risolvere questo problema, il più semplice è quello di ipotizzare che un numero è un quadrato perfetto se c'è un numero intero che moltiplicato per se stesso da proprio il quadrato cercato. Per trovare questo numero, se esiste, mi creo una variabile contatore, i in questo codice che ciclicamente aumenta di 1 e provo a vedere se soddisfa la condizione richiesta. Quindi avremo 1*1 == numero? , 2*2 == numero?, ... 8*8== numero? e cosi via. Il ciclo si interrompe se il prodotto di tale elemento per se stessi supera il numero stsso. Altra condizione poteva essere solo posta sulla i < numero o i < numero/2 

'''
scrivi un programma che stampi i quadrati perfetti tra due estremi 
inclusi assegnati in input, senza ordine particolare
'''
i = 0   

a = eval(input("Inserisci numero a ")) 
b = eval(input("Inserisci numero b "))  

#mi assicuro che a sia più piccolo di b
if b < a:
    tmp = a
    a = b
    b = tmp

#ciclo tra i due estremi
for numero in range(a,b):
    i=0
    #controllo se il numero può essere ottenuto come
    #un quadrato
    while i*i <= numero:
        i = i + 1
        if i*i  == numero:
            print(i*i)

Stampa