2016-09-15 1 views
1

пожалуйста, что не так с этим кодомКак преобразовать десятичное в двоичную с использованием алгоритмов в Python

def binary_converter(n): 
    n = int(n) 

    if n == 0: 
     return '0' 

    elif n not in (0,255): 
     return 'Invalid input' 


    elif n in range (0,255): 
     return binary_converter(n//2) + str(n%2) 


    else: 
     return 'Invalid conversion'## Heading ## 

here is the test 
import unittest 

class BinaryConverterTestCases(unittest.TestCase): 
    def test_conversion_one(self): 
    result = binary_converter(0) 
    self.assertEqual(result, '0', msg='Invalid conversion') 

    def test_conversion_two(self): 
    result = binary_converter(62) 
    self.assertEqual(result, '111110', msg='Invalid conversion') 

    def test_no_negative_numbers(self): 
    result = binary_converter(-1) 
    self.assertEqual(result, 'Invalid input', msg='Input below 0 not allowed') 

    def test_no_numbers_above_255(self): 
    result = binary_converter(300) 
    self.assertEqual(result, 'Invalid input', msg='Input above 255 not allowed') 
+0

почему на земле 62 является частным случаем? –

+0

@DarthKotik в тесте также должен возвращать недопустимый вход. – David

+0

@PadraicCunningham ваш правильный, но я все равно получаю сообщение об ошибке при отправке его. P/S это назначение для изучения дома andela. Мне нужны советы, а не полный код, так как я действительно хочу это правильно изучить. спасибо всем – David

ответ

1

Во-первых, (0, 255) является кортеж не диапазон чисел так 2 in (0, 255) и т.д .. есть сбой, диапазоны полуоткрыты, поэтому range(0,255) идет от 0...254, снова 255 in range (0,255) -> False. Ваш третий тест self.assertEqual(result, '111110', msg='Invalid conversion') терпит неудачу, как вы всегда добавляю ведущий «0» в вашем базовом случае, так что вы получите '0111110' не '111110':

def binary_converter(n): 
    n = int(n) 
    if n == 0: 
     return '0' 
    # same as checking "if n in xrange(256)" 
    if 0 <= n <= 255: 
     return (binary_converter(n // 2) + str(n % 2)).lstrip("0") 
    elif 0 > n or n > 255: 
     return 'Invalid input' ## Heading ## 
    return 'Invalid conversion' ## Heading ## 

После того, как вы сделаете изменения все тесты должны пройти.

Вы также могли бы сделать это итеративно:

def binary_converter(n): 
    if n < 0 or n > 255: 
     return "Invalid input" 
    tmp = [] 
    while n: 
     n, i = divmod(n, 2) 
     tmp.append(str(i)) 
    return "".join(tmp[::-1] or "0") 
+0

, ты сделал мне огромную услугу .. я не заметил, что упустил всего несколько ошибок. Я очень ценю это, большое спасибо. – David

+0

Не беспокойтесь, пожалуйста. –

 Смежные вопросы

  • Нет связанных вопросов^_^