Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Soma de ímpares consecutivos

Sabe-se que um número da forma n**3 é igual a soma de n ímpares consecutivos.

Exemplo: 1**3= 1,  2**3= 3+5,   3**3= 7+9+11,   4**3= 13+15+17+19,...
Dado m, determine os ímpares consecutivos cuja soma é igual a n**3 para n assumindo valores de 1 a m.

Achei um código na internet mas também não consegui entender:

m = int(input("Digite m: "))

aux = 1

for n in range(1, m+1):
    print("O número", n, "elevado ao cubo tem como soma: ")
    if n == 1:
        print(aux)
    else:
        for aux in range(aux+2, aux+2*(n+1), 2):
            print(aux)

Outra solução da internet:

m = int(input("Digite m: "))
n = 1
for n in range(m+1):
    soma, cont, x, aux = 0, 1, 1, n
    for cont in range(n):
        soma = soma + 2*cont

    while x <= aux**3:
        if aux**3 == x*aux + soma:
            print ("O número", aux, "elevado ao cubo tem como soma: ")
            while aux - 1 >= 0:
                r = x + 2*(aux - 1)
                print (r)
                aux -= 1
            x = aux**3
        x += 1

Amigos, estou quebrando a cabeça aqui mas não consegui resolver o problema ou entender os códigos... Alguma ideia?

3 respostas
solução!

Em qual tema especificamente você está com dúvidas? Na lógica do exercício, no calculo, nos resultados, nos padrões... ?

A propósito, no seu último tópico você não marcou uma resposta como "solução", resolveu o problema? Da uma conferida lá

Tirei um tempo aqui pra anotar o exercício e através dos 4 exemplos dados, peguei um papel e anotei para encontrar padrões. Não importa se sua anotação está bonita, o importante é você visualizar a construção da sua lógica fora da cabeça

Pelas anotações eu notei que o único número que precisa de um cálculo seria o primeiro da lista, pois os demais bastaria somar 2 para obter. A quantidade de somas necessárias também já nos foi fornecida, que é M.

Ex: 3³ = (7, 9, 11) = 27 | 4³ = (13, 15, 17, 19) = 64 | 5³ = (21, 23, 25, 27, 29) = 125...

Note acima, o nosso M determina quantos números ímpares há entre nossos parênteses. Por agora já sabemos qual é nosso M e quantos números ímpares precisamos na lista para somar todos eles e no final dar o resultado certo de M ao cubo. Então agora o que falta? Como eu disse acima, precisamos saber como obter o primeiro número da lista.

Sem alongar muito, eu notei que se multiplicarmos M por M - 1, teremos um número PAR antes do correto, por exemplo, vou lhe demonstrar essa analogia utilizando os 3 exemplos acima:

  • 3 x 2 = 6 (mas o correto seria 7)
  • 4x3 = 12 (mas o correto seria 13)
  • 5x4 = 20 (mas o correto seria 21)

Aqui encontramos mais um padrão útil, se todos números que obtemos nesses cálculos nós "erramos" o resultado por 1, então basta somar 1 ao resultado e resolvemos o problema.

Pronto, agora temos tudo o que precisamos: sabemos o valor de M, sabemos como encontrar o primeiro número, sabemos quantos números ímpares são necessários para obter o resultado correto do cálculo, então bora pro código:

m = int(input("Digite o valor de m: ")) #Recebe o número de M
start = m * (m-1) + 1 #Obtem o primeiro número da ordem multiplicando nosso M por M - 1 e somamos 1 ao resultado
list_numbers = [start] #Cria uma lista e adiciona o primeiro número na lista

for n in range(1, m): #cria um loop para adicionar os demais números ímpares restantes
    start += 2 #cada soma de 2 sob um número impar sempre dará impar
    list_numbers.append(start) #adiciona o próximo número ímpar na lista

print(list_numbers) #mostra a lista na tela

Agora deixo pra você fazer as implementações restantes, que é mostrar na tela de forma organizada todos esses valores e seus respectivos resultados :)

Bom dia, Thiago Matos . Eu tinha ficado em dúvida tanto na lógica quanto na implementação. Vou estudar o seu código e explicações. Obrigado

Certo, caso tenha resolvido você pode marcar a resposta no tópico. Caso ainda tenha dúvidas pode postar no tópico :)