Aula 07: Laços aninhados (repetições encaixadas)

Tópicos

Aulas a distância - Google Meet:

Para verem os vídeos, vocês devem estar logados no e-mail da usp.

Laços aninhados (repetições encaixadas)

Exemplo 1: Fatorial de uma sequência de números

Faça um programa que lê uma sequência de números inteiros não negativos, exibindo para cada número da sequência o seu fatorial.

Exemplo 1:

Mostrar uma pirâmide semelhante a abaixo, sendo que o maior valor da pirâmide é definido pelo usuário. Ex: n=9
9 8 7 6 5 4 3 2 1 
8 7 6 5 4 3 2 1 
7 6 5 4 3 2 1 
6 5 4 3 2 1 
5 4 3 2 1 
4 3 2 1 
3 2 1 
2 1 
1 
n = int(input("Digite n: "))

j = n
while j > 0:
    i = j
    while i > 0:
        print(i,end=" ")
        i -= 1
    print()
    j -= 1
  

Exemplo 2:

Dado um número inteiro n (n>1), e um número inteiro m (m>1), faça um programa que calcula o resultado da soma:
somatorio

soma = 0
i = 1
while i <= n:
    j = 1
    while j <= m:
        #numerador:
        num = i*i*j 
        #denominador:
        den = (3**i)*(j*(3**i) + i*(3**j))
        soma += num/den
        j += 1
    i += 1

print("Soma:",soma)
  
Uma solução alternativa pode ser obtida através da manipulação dos somatórios:

somatorio

soma = 0
i = 1
while i <= n:
    somaj = 0
    pi = 3**i
    j = 1
    while j <= m:
        somaj += j/(j*pi + i*(3**j))
        j += 1
    soma += (i*i/pi)*somaj
    i += 1

print("Soma:",soma)
  

Problema 1:

Dado um número inteiro n, n>1, imprimir sua decomposição em fatores primos, indicando também a mutiplicidade de cada fator.
Por exemplo, para n=600, a saída deverá ser:

Solução:

n = int(input("Digite n: "))
print("Decomposição de",n,"em fatores primos:")

fator = 2
while n > 1:
    mult = 0
    while n % fator == 0:
        n = n // fator
        mult += 1
    if mult > 0:
        print("fator",fator,"multiplicidade",mult)
    fator += 1
  

Problema 2:

Sabe-se que cada número da forma n3 é igual a soma de n ímpares consecutivos.
Exemplos: 13= 1,   23= 3 + 5,   33= 7 + 9 + 11,   43= 13 + 15 + 17 + 19.

Dado um número inteiro m, m>0, determinar os ímpares consecutivos cuja soma é igual a n3, para n assumindo valores de 1 a m.

Solução 1:

m = int(input("Digite m: "))
n = 1
while n <= m:
    inic = 1
    soma = 0
    while soma != n*n*n:
        soma = 0
        i = 1
        while i <= n:
            soma += inic + (i-1)*2
            i += 1
        inic += 2
    inic -= 2
    print(n*n*n,"=",end=" ")
    print(inic, end=" ")
    i = 2
    while i <= n:
        print("+",inic + (i-1)*2, end=" ")
        i += 1
    print()
    n += 1
  

Solução 2:

Evita o laço mais interno, aplicando a fórmula da soma dos termos da PA.

m = int(input("Digite m: "))
n = 1
while n <= m:
    inic = 1
    soma = 0
    while soma != n*n*n:
        soma = ((inic + inic+(n-1)*2)*n)//2
        inic += 2
    inic -= 2
    print(n*n*n,"=",end=" ")
    print(inic, end=" ")
    i = 2
    while i <= n:
        print("+",inic + (i-1)*2, end=" ")
        i += 1
    print()
    n += 1
  

Solução 3:

Solução praticamente idêntica a anterior. Apenas foram mudadas a ordem de alguns comandos e a inicialização de inic, de modo a evitar o comando inic -= 2 após o laço mais interno.

m = int(input("Digite m: "))
n = 1
while n <= m:
    inic = -1
    soma = 0
    while soma != n*n*n:
        inic += 2
        soma = ((inic + inic+(n-1)*2)*n)//2

    print(n*n*n,"=",end=" ")
    print(inic, end=" ")
    i = 2
    while i <= n:
        print("+",inic + (i-1)*2, end=" ")
        i += 1
    print()
    n += 1
  

Solução 4:

Solução mais compacta, aproveitando o fato de que o último termo de uma sequência e o início da próxima são ímpares consecutivos.
Por exemplo, observe que a sequência do 2 elevado ao cubo termina em 5, enquanto que a sequência do 3 elevado ao cubo começa no 7 = 5+2.

m = int(input("Digite m: "))
n = 1
imp = 1  #primeiro dos ímpares de uma sequência que soma n^3
while n <= m:
    print(n*n*n,"=",end=" ")
    print(imp, end=" ")
    i = 2
    while i <= n:
        imp += 2
        print("+",imp, end=" ")
        i += 1
    print()
    imp += 2   #início da próxima sequência
    n += 1
  

Vamos agora provar a validade da solução acima. Isto é, vamos demonstrar que, de fato, o último termo de uma sequência e o início da próxima são ímpares consecutivos.

Procuramos pela soma de n ímpares consecutivos (a1, a2, a3, ..., an) resultando em n3:

equacao1

Os n ímpares consecutivos formam uma progressão aritmética (PA) de razão 2 (R=2). Logo, podemos usar a fórmula do termo geral da PA: ai = a1 + (i-1)*R.

equacao2

Além disso, podemos aplicar a fórmula da soma dos termos da PA:

equacao3

Combinando a fórmula da soma dos termos da PA com a fórmula do termo geral para o n-ésimo termo, temos:

equacao4

Dado que sabemos que a1 é um número ímpar, podemos escrevê-lo na forma a1 = k*2+1, em que k é um número inteiro.

equacao5

Portanto, temos que:

equacao6

Isolando k, temos que:

equacao7

Portanto, a1 pode ser calculado por:

equacao8    (*)

Aplicando a fórmula do termo geral para o n-ésimo termo, temos então:

equacao9

O início da próxima sequência pode então ser calculado, trocando-se n por n+1 na equação (*):

equacao10

Ou seja, temos acima um valor igual a an + 2, como se queria demonstrar.



Solução 5:

Uma quinta solução pode ser obtida calculando-se o início de cada sequência diretamente através da equação (*) (isto é, a1 = n2 - n + 1) para cada valor de n.
A escrita do código Python desta quinta solução fica como exercício para o leitor.