quarta-feira, 13 de setembro de 2017

O número em falta

Este problema apareceu no Quora.
"Neste fila
2491771842155490223116351359624312364528611014378220168235412194624714016711713319814428177371372322483356775157513821213812018915616178169180422057425055702049257200441752021649520319463179155401482271358391661117611818617619918524622611214787196431912247122923132852316022867242822118221107236471216824475181150239121712918214915910923798652331532147215125222170494190146216102161182971832061006216327616919791582131417224013622832171920823414111920188116842613237131811954516213053245241210105361242183110491312860155099247920710123810311423018722589102126931061741129193139134341491423011512712511380881921451541731651085920912215220148
estão todos os números entre 1 e 250, menos um, colocados por uma ordem aleatória. Qual é o número em falta?"
Este problema, na sua  simplicidade, levanta algumas questões interessantes, e nem todos olham para ele da mesma maneira...
Eu comecei por querer saber quantos algarismos estão na fila e quantos estariam se os 250 números lá estivessem.
Os computadores servem para fazer estas coisas com muita facilidade (eu gosto de Python, mas qualquer linguagem de programação é boa)

s="2491771842155490223116351359624312364528611014378220168235412194624714016711713319814428177371372322483356775157513821213812018915616178169180422057425055702049257200441752021649520319463179155401482271358391661117611818617619918524622611214787196431912247122923132852316022867242822118221107236471216824475181150239121712918214915910923798652331532147215125222170494190146216102161182971832061006216327616919791582131417224013622832171920823414111920188116842613237131811954516213053245241210105361242183110491312860155099247920710123810311423018722589102126931061741129193139134341491423011512712511380881921451541731651085920912215220148"
print (len(s))
v=""
for i in range (1,251):
    v = v + str(i)
print (len(v))


A primeira instrução de print dá-nos o comprimento da lista dada, 640, e a segunda instrução de print dá-nos o comprimento da lista dos 250 números construída com as instruções anteriores, 642.
Portanto, o número em falta tem dois algarismos, necessariamente iguais, pois se fossem diferentes ficaríamos com duas respostas possíveis.
Não é difícil saber quais são:

for i in range (0, 10):
    cs = 0
    for j in s:
        if j == str(i):
            cs = cs + 1
    cv = 0
    for j in v:
        if j == str(i):
            cv = cv + 1
    print (i, cs, cv)


O resultado deste programa todo é

640
642
0 45 45
1 155 155
2 106 106
3 55 55
4 55 55
5 46 46
6 43 45
7 45 45
8 45 45
9 45 45


(colorido a posteriori) e concluí-se que o número em falta é o 66!

Sem comentários:

Enviar um comentário