2015-07-05 2 views
-4

Я пытался решить задачу 17 эйлера проекта. Однако мой ответ 21088, но правильный ответ - 21124. Мой ответ должен быть выше 36. Я не могу понять, что не так. Может ли кто-нибудь помочь?Project Euler 17 с помощью Python 2.7

Код:

dict = {0: '', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 9: 'nine', 
       10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen', 
      17: 'seventeen', 18: 'eighteen', 19: 'nineteen', 20: 'twenty', 30: 'thirty', 40: 'forty', 50: 'fifty', 
      60: 'sixty', 70: 'seventy', 80: 'eighty', 90: 'ninety', 100: 'hundred', 1000: 'onethousand'} 

def pronounce(number): 

    if number < 21: 
     words = dict[number] 

    string = str(number) 
    if 21 <= number < 100: 
     words = dict[int(string[0])*10] + dict[int(string[1])] 

    if 100 <= number < 1000: 
     words = dict[int(string[0])] + dict[100] + 'and' + dict[int(string[1])*10] + dict[int(string[2])] 

    if number % 100 == 0: 
     words = dict[int(string[0])] + dict[100] 

    if number == 1000: 
     words = dict[1000] 

    return words 

full = '' 

for i in range(1,1001): 
    full += pronounce(i) 

print full 

print len(full) 
+0

В чем проблема? Кроме того, пожалуйста, правильно отформатируйте свой код, вставив четыре пробела перед каждой строкой. Кнопка «Код образца» на панели инструментов редактора (Ctrl + K) сделает это за вас. – Ryan

+0

Совет: не используйте встроенные функции Python в качестве имен переменных. В этом случае не используйте 'dict', а что-то вроде' my_dict'. – Evert

+0

Вы не упомянули, какой проект № 17 Эйлера; вы не указываете, какова цель вашей программы. Поскольку мы не хотим искать вокруг него (и не все узнают наизусть, что это такое), вы должны [изменить] свой вопрос, чтобы обновить его с соответствующей информацией. – Evert

ответ

0
nums = {0: '', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 9: 'nine', 
       10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen', 
      17: 'seventeen', 18: 'eighteen', 19: 'nineteen', 20: 'twenty', 30: 'thirty', 40: 'forty', 50: 'fifty', 
      60: 'sixty', 70: 'seventy', 80: 'eighty', 90: 'ninety', 100: 'hundred', 1000: 'onethousand'} 

def expandByPlaceValue(num): 
    count = len(str(num)) - 1 
    thestr = str(num) 
    otherstr = "" 
    for char in thestr: 
     for x in range(count): 
      char += "0" 
     if count == len(str(num)) - 1: 
      otherstr += char 
      count -= 1 
      continue 
     otherstr += "+" + char 
     count -= 1 
    return otherstr 

def correct(num, strings): 
    if int(str(num)[-2:]) in nums.keys(): 
     del strings[-2:] 
     strings.append(nums[int(str(num)[-2:])]) 
    return strings 


def convert(num): 
    str = "" 
    for x in expandByPlaceValue(num).split("+"): 
     if x[0] != "1": 
      str += nums[int(x[0])] 
      l = list(x) 
      l[0] = "1" 
      x = ''.join(l) 
     str += nums[int(x)] + " " 
    str = correct(num, str.split(" ")) 
    return ','.join(str).replace(",", " ") 



print(convert(978)) 

отредактирован и DONE

Пожалуйста, исправьте ваши варианты написания чисел

+0

Это чертовски хорошо протестировано XD – ytpillai

+0

Это только преобразует единственное число. Вы можете перебирать числа, получать значение, затем добавлять их к строке, а затем подсчитывать, игнорируя пробелы и дефисы. – ytpillai

+0

ВЫ ПРИВЕТСТВУЕТЕ! – ytpillai

0

Используйте этот код, если вы хотите 100 быть one hundred

nums = {0: '', 1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven', 8: 'eight', 9: 'nine', 
       10: 'ten', 11: 'eleven', 12: 'twelve', 13: 'thirteen', 14: 'fourteen', 15: 'fifteen', 16: 'sixteen', 
      17: 'seventeen', 18: 'eighteen', 19: 'nineteen', 20: 'twenty', 30: 'thirty', 40: 'forty', 50: 'fifty', 
      60: 'sixty', 70: 'seventy', 80: 'eighty', 90: 'ninety', 100: 'hundred', 1000: 'onethousand'} 

def expandByPlaceValue(num): 
    count = len(str(num)) - 1 
    thestr = str(num) 
    otherstr = "" 
    for char in thestr: 
     for x in range(count): 
      char += "0" 
     if count == len(str(num)) - 1: 
      otherstr += char 
      count -= 1 
      continue 
     otherstr += "+" + char 
     count -= 1 
    return otherstr 

def correct(num, strings): 
    if int(str(num)[-2:]) in nums.keys(): 
     del strings[-2:] 
     strings.append(nums[int(str(num)[-2:])]) 
    return strings 


def convert(num): 
    str1 = "" 
    count = len(str(num)) - 1 
    for x in expandByPlaceValue(num).split("+"): 
     if x[0] and count > 1: 
      str1 += nums[int(x[0])] + " " 
      l = list(x) 
      l[0] = "1" 
      x = ''.join(l) 
     str1 += nums[int(x)] + " " 
     count -= 1 
    str1 = correct(num, str1.split(" ")) 
    return ','.join(str1).replace(",", " ") 



print(convert(int(input("Enter a number"))))