Persistência...multiplicativa!

Secção dedicada à linguagem de programação favorita dos quarkianos: Python!

Persistência...multiplicativa!

Mensagempor jap em Quarta Dez 03, 2008 10:46 pm

Mais um problema para treino pitónico:

A persistência multiplicativa de um número inteiro é definida como o número de passos necessários para atingir um número de um só dígito através do processo iterativo de multiplicação dos dígitos do número. Por exemplo, a persistência multiplicativa de 679 é 5, pois

679 \to (6 \times 7 \times 9 =)378 \to (3 \times 7 \times 8 =)168 \to  (1 \times 6 \times 8 =)48 \to
\to (4 \times 8 =)32 \to (3 \times 2 =)6

A persistência de um número de um só dígito é 0. Sabe-se que existem números de persistência multiplicativa 11, mas não se tem a certeza se existem números de persistência multiplicativa igual ou superior a 12. :shock:
Simulações computacionais mostram que estes números, a existirem, terão certamente mais de 3 000 dígitos!
Escrevam um programa para calcular a persistência multiplicativa de um número, e mostrem que todos os números inferiores a 10 000 têm uma persistência multiplicativa inferior a 7! :P
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Persistência...multiplicativa!

Mensagempor Ivo_Timóteo em Sexta Dez 05, 2008 6:32 pm

Código: Seleccionar Todos
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.

    ****************************************************************
    Personal firewall software may warn about the connection IDLE
    makes to its subprocess using this computer's internal loopback
    interface.  This connection is not visible on any external
    interface and no data is sent to or received from the Internet.
    ****************************************************************
   
IDLE 1.2.2     
>>> ================================ RESTART ================================
>>>
7
>>>


E para não ficar muito no ar...

Código: Seleccionar Todos
def persistencia(n):
    max=0
    for i in range(1, n+1):
        a = persisMul(i)
        if a>max:
            max=a
    return max

print persistencia(10000)


A última parte do código :)

Se quiserem mostro o resto :P
Avatar do utilizador
Ivo_Timóteo
charm-Quark!
charm-Quark!
 
Mensagens: 579
Registado: Quarta Nov 15, 2006 7:25 pm
Localização: V. N. Gaia

Re: Persistência...multiplicativa!

Mensagempor jap em Sexta Dez 05, 2008 7:17 pm

Com a ajuda do Ivo, agora é só escrever a função persisMul!

:P
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Persistência...multiplicativa!

Mensagempor Tharis em Sexta Dez 19, 2008 11:20 pm

Código: Seleccionar Todos
>>> def persisMul(x):
   i=0
   x=str(x)
   while len(x)>1:
       digits=map(int,list(x))
       x=str(reduce(lambda x,y: x*y,digits))
       i+=1
   return i

>>> def persistencia(n):
    max=0
    for i in range(1, n+1):
        a = persisMul(i)
        if a>max:
            max=a
    return max

>>> print persistencia(10000)
6


Pretty easy!
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Persistência...multiplicativa!

Mensagempor jap em Sábado Dez 20, 2008 12:39 am

Parabéns, Tharis! :hands:

Vê-se que temos programador! :P

PS: Já agora, não precisas de fazer

Código: Seleccionar Todos
digits=map(int,list(x))


Se x é uma string

basta fazer

Código: Seleccionar Todos
digits=map(int,x)


Na realidade, as ferramentas de programação funcional map, filter, reduce funcionam para qualquer sequência (listas, tuplas ou strings). :wink:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Persistência...multiplicativa!

Mensagempor Tharis em Sábado Dez 20, 2008 12:44 am

Tyvm

Quanto ao map e ao list, nem me lembrei! :P

Anyway, depois meto cá uns mais difíceis
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Persistência...multiplicativa!

Mensagempor jap em Sábado Dez 20, 2008 12:51 am

Outra dica: o pedaço de código

Código: Seleccionar Todos
       if a>max:
            max=a


não é lá muito pitónico! :lol:

Deverás utilizar outro nome para o objecto que guarda o máximo (por exemplo, amax) , porque max é o nome de uma função pré-definida no Python. Usando esta função, o código acima pode ser substituído por

Código: Seleccionar Todos
amax = max(a,amax)

:wink:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6805
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Persistência...multiplicativa!

Mensagempor Tharis em Sábado Dez 20, 2008 12:57 am

jap Escreveu:Outra dica: o pedaço de código

Código: Seleccionar Todos
       if a>max:
            max=a

não é lá muito pitónico! :lol:


Esse pedaço de código nao é meu! :P

jap Escreveu:Deverás utilizar outro nome para o objecto que guarda o máximo (por exemplo, amax) , porque max é o nome de uma função pré-definida no Python. Usando esta função, o código acima pode ser substituído por

Código: Seleccionar Todos
amax = max(a,amax)

:wink:


Sure. Mas como aqui não era necessário o uso da função, there's no prob. ;)
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm


Voltar para Pitónica

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 1 visitante

cron