Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como adicionar um dígito em número conforme a ordem dos seus algarismos?

0 votos
15 visitas
perguntada Nov 2 em Ciência da Computação por Alan Antunes Rosendo (41 pontos)  

Considere um inteiro não negativo n os quais os dígitos sempre aparecem em ordem ascendente da esquerda para a direita, como em 24667. Em outras palacas, se \(d_{m-1}...d_1d_0\) representa a sequência de (m) dígitos de n, então \(d_i\leq d_j\) para \(i< j\). Dado um dígito adicional \(0\leq x \leq 9\), escreva uma função que retorne o inteiro que resulta da inserção de x em n, tal que o digito também apareça em ordem ascedente da esquerda para a direita. Por exemplo, se n=24667 e x=5, a função deve retornar 245667. Evite redudâncias em casos básicos.

Exercício 4.15 do Cap. 4 do livro "Introduction to recursive programming" de Manuel Rubio-Sanchez.

Compartilhe

1 Resposta

+1 voto
respondida Nov 2 por Alan Antunes Rosendo (41 pontos)  

A solução do problema foi desenvolvida com base em 4 funções:
1 - Transformo o número em uma lista
2 - Ordeno a lista utilizando uma função recursiva
3 - Transformo a lista ordenada em um número
4 - Adiciono o dígito na lista, rodo as funções anteriores e retorno o número com o dígito incluso.

Para transformar o número em uma lista, utilizo o seguinte código:

def trans_list(num):
    x=[int(a) for a in str(num)]
    return x

Utilizo a função recursiva para ordenar a lista:

def select_sort_rec(a):
    if len(a)<=1:
        return a
    else:
        b=list(a)
        m=min(b)
        b.remove(m)
        return [m] + select_sort_rec(b)

Utilizo a seguinte função para transformar a lista em um número:

def trans_int(lista):
    a=len(lista)
    x=0
    for i in range(0,len(lista)):
        x+=lista[i]*10**(len(lista)-i-1)
    return x

Finalmente, utilizo uma função que insere o número na lista e roda as funções anteriores:

def insert_numb(numero,insercao):
    lista=trans_list(numero)
    lista.append(insercao)
    reordem=select_sort_rec(lista)
    x=trans_int(reordem)
    print(x)
    return x

Para testar a função, utilizo o exemplo do livro:

if __name__ == '__main__':
    numero=24667
    insercao=5
    insert_numb(numero,insercao)

Com isso obtenho 245667, conforme solicitado.

comentou Nov 5 por Sergio Costa (11 pontos)  
Caro Alan,

Parabéns pela a solução. O código ficou simples e explicativo, utilizando um algoritmo do tipo selection sort, que funciona muito bem para uma lista pequena.

Talvez, com uma lista muito grande, fosse interessante utilizar o quicksort. Não obstante, a solução ficou muito boa.

Um abraço,

Sergio
...