Jump to content
Gonkali

[Resolvido] Operador de Divisão

Recommended Posts

Gonkali

Boa Tarde, foi-me proposto o seguinte exercicio :

"Write a program that reads two positive integers a and b on separate lines. If a is divisible by b, print the message "divisible". Otherwise, print the message "not divisible""

Para a Resolução do mesmo criei o seguinte código:

a = input ()
b = input ()
c = int(a)/int(b)
if c == int( c ):
   print ('divisible')
if c == float( c ):
   print ('not' + ' divisible')

Para os seguintes resultados:

Results for test case 1 out of 3

Input:

18

4

Program executed without crashing.

Program gave the following correct output:

not divisible

Results for test case 2 out of 3

Input:

24

6

Program executed without crashing.

Program output:

divisible

not divisible

Expected this correct output:

divisible

Result of grading: Your output is not correct.

Se me puderem ajudar, gostava de saber o que estou a fazer de mal, sendo que no resultado 2/3, ele está a considerar 2 outputs.

Obrigado

Gonçalo

Edited by thoga31
GeSHi

" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Share this post


Link to post
Share on other sites
thoga31

Simples: se o número for inteiro, c == float( c ) também se cumpre! Essa é uma condição sempre verdadeira!

Porque é que não utilizaste um else? E porquê concatenar 2 strings no output do segundo caso?

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
Gonkali

Simples: se o número for inteiro, c == float( c ) também se cumpre! Essa é uma condição sempre verdadeira!

Porque é que não utilizaste um else? E porquê concatenar 2 strings no output do segundo caso?

Desculpa Thoga, não percebi a 1ª parte.

Não utilizei um else porque estou a seguir o tutorial do cscircles e ainda não cheguei ao "capitulo Else,And,Or,Not", quanto a concatenação, utilizei porque ele estava a assumir o Not como função.

Edited by Gonkali
Quotes corrigidos

" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Share this post


Link to post
Share on other sites
thoga31

@Gonkali, quando calculas c, ele fica do tipo float (estás a fazer uma divisão). Portanto, c==float( c ) é sempre verdade, no matter what. Se c for um número inteiro, o que vai o Python ver? Exemplo: c = 5.0, portanto c == float( c ) --> 5.0 == float (5.0) --> 5.0 == 5.0 --> verdade!

Portanto, aquela condição é sempre, mas sempre, verdadeira.

Se não deste o else, então deverás fazer isto:

if c == int( c ):
   print ('divisible')
if not (c == int( c )):
   print ('not divisible')

Mas como o else é simples, eu até de dou a solução para veres:

if c == int( c ):
   print('divisible')
else:
   print('not divisible')

Quanto ao assumir o "not" como função, esta é que eu não percebi mesmo. Explica.

Deixo só uma nota: a melhor forma de ver se dois números são divisíveis um pelo outro não é essa, mas sim utilizando o resto da divisão.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

Ah, já agora, uma solução mais "exótica":

print(("not " if a % b != 0 else "") + "divisible")


Knowledge is free!

Share this post


Link to post
Share on other sites
Gonkali

Percebido ;)

Mas como o else é simples, eu até de dou a solução para veres:

if c == int( c ):
   print('divisible')
else:
   print('not divisible')

Utilizar o else, é bem mais fácil e prático, acho que nos próximos exercicios vou começar a usar.

Quanto ao assumir o "not" como função, esta é que eu não percebi mesmo. Explica.

Thoga, esquece, estupidez minha, inicialmente não pus os apostrofos e estava assim print (not divisible) e deu uma mensagem de erro a indicar que não reconhecia a ligação a função Not e a String.

Deixo só uma nota: a melhor forma de ver se dois números são divisíveis um pelo outro não é essa, mas sim utilizando o resto da divisão.

Estava mesmo a espera que isto me desse problemas, não comprendi muito bem a parte do resto da divisão e já estava mesmo a espera que ela voltaria to bite my a**.

Já passei essa parte mas o exercicio proposto era fácil e por uma questão de lógica consegui resolver, pois era apenas para fazer a divisão de um input() para descobrir quantas caixas com capacidade para 12 ovos se podia fazer e saber o resto.

Ovos = input()
Caixa = 12
Ncaixas = int(Ovos)/int(Caixa)
Resto = int(Ovos)%int(Caixa)
print (int(Ncaixas))
print (Resto)

Ah, já agora, uma solução mais "exótica":

print(("not " if a % b != 0 else "") + "divisible")

Por acaso, a maneira como este código está descrito utilizando o operador de resto e a concatenação, faz me mais sentido. O.o

Edited by thoga31
Tags quote + formatação do tópico subsequente + GeSHi

" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Share this post


Link to post
Share on other sites
Pedro C.

Repare-se que para versões anteriores a Python 3.0 a divisão de dois inteiros dá, necessariamente, um inteiro (como, aliás, acontece nas linguagens de mais baixo nível como o C de onde o Python vem). Utilizando a minha versão 2.7:

In [10]: 5/2
Out[10]: 2

In [11]: from __future__ import division

In [12]: 5/2
Out[12]: 2.5

Note-se que estou a importar a divisão de um modulo que se chama "futuro". Penso que foi a maneira que eles arranjaram de ir metendo as características de Python 3.0 nas versões anteriores enquanto este não tinha uma "release".

Share this post


Link to post
Share on other sites
thoga31

Estava mesmo a espera que isto me desse problemas, não comprendi muito bem a parte do resto da divisão e já estava mesmo a espera que ela voltaria to bite my a**.

Já percebeste, ou preferes que te explique? ;)

Por acaso, a maneira como este código está descrito utilizando o operador de resto e a concatenação, faz me mais sentido. O.o

Não me admira. Mas não abuses disto, só nestes casos mais simples faz sentido utilizar esta notação. Noutros casos pode não ser prático ou mesmo ser impossível.


Knowledge is free!

Share this post


Link to post
Share on other sites
Gonkali

Já percebeste, ou preferes que te explique? ;)

Se me puderes explicar agradecia imenso :)


" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Share this post


Link to post
Share on other sites
thoga31

Se me puderes explicar agradecia imenso :)

Lembras-te das "contas em pé"? As da divisão eram e são as mais chatas, mas vamos com um exemplo simples:

25   | 2
    ------
05     12
1

Portanto, o quociente é 12 e o resto é 1. A divisão poderia ter proseeguido de forma a obteres as casas decimais, mas isto é o que nos interessa para distinguir dois operadores: a divisão inteira e o módulo. Watch this:

>>> 25 / 2   # Divisão dita "normal" no Python 3.x
12.5
>>> 25 // 2  # quociente inteiro
12
>>> 25 % 2   # resto da divisão
1

Se dois números são, então, divisíveis, aquele resto tem de dar 0. Se não der zero, então tens de acrescentar uns 0's nas casas decimais do numerador (neste caso 25) e vais obter um número decimal como resultado (neste caso 12,5), e isto até que o resto final seja 0, o que nem sempre acontece:

25,0 | 2
    ------
05     12,5
10
 0

5,00  | 4
     ------
1 0     1,25
 20
  0

Se os números são divisíveis, então não precisas dessa "cirurgia":

125  | 5
    ------
25    25
 0

Como podes ver, chegámos a um resto 0 sem "prolongar" o nosso 125.

Moral da história: se dois números inteiros são divisíveis, então o resto da divisão é zero.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
Gonkali

Lembras-te das "contas em pé"? As da divisão eram e são as mais chatas, mas vamos com um exemplo simples:

25 | 2
------
05 12
1

Portanto, o quociente é 12 e o resto é 1. A divisão poderia ter proseeguido de forma a obteres as casas decimais, mas isto é o que nos interessa para distinguir dois operadores: a divisão inteira e o módulo. Watch this:

>>> 25 / 2   # Divisão dita "normal" no Python 3.x
12.5
>>> 25 // 2  # quociente inteiro
12
>>> 25 % 2   # resto da divisão
1

Se dois números são, então, divisíveis, aquele resto tem de dar 0. Se não der zero, então tens de acrescentar uns 0's nas casas decimais do numerador (neste caso 25) e vais obter um número decimal como resultado (neste caso 12,5), e isto até que o resto final seja 0, o que nem sempre acontece:

25,0 | 2
------
05 12,5
10
0

5,00 | 4
------
1 0 1,25
20
0

Se os números são divisíveis, então não precisas dessa "cirurgia":

125 | 5
------
25 25
0

Como podes ver, chegámos a um resto 0 sem "prolongar" o nosso 125.

Moral da história: se dois números inteiros são divisíveis, então o resto da divisão é zero.

Obrigado Thoga.

Finalmente consegui perceber ;)

Obrigado pela tua ajuda e pelo esclarecimento.

Um abraço.

Gonçalo


" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Share this post


Link to post
Share on other sites
icemonster2

Boa mas não tenhas receio em publicar mais tópicos sobre as tuas duvidas nem receio que estejas a ser chato porque aqui toda a gente gosta de aprender, partilhar o seu próprio conhecimento e possivelmente vais estar a ajudar outros com estes tópicos que tenham as mesmas duvidas que tu. Apenas não caias na tentação de pedir exclarecimentos sempre que te apareçer uma minima duvida. Vai tentando fazer por ti e se não conseguires fazer então posta aqui a tua duvida que será um prazer responder.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.