2014-09-03 2 views
1

Donc, je travaillais sur le projet Euler n ° 17, en essayant de trouver la réponse, sans vraiment viser l'efficacité. Cependant, après avoir lu tous les numéros (je pense) imprimés, je ne peux pas trouver ce qui mène à une réponse exactement 100 caractères sur la bonne réponse. Alors j'ai décidé de venir sur SO pour savoir, et quand je l'ai compilé en ligne en utilisant Python 2.7 sur accident, j'ai eu un résultat radicalement différent! Je ne suis pas sûr pourquoi la compilation dans Python 2.7 conduit à une réponse sensiblement fausse, et dans Python 3 c'est à peine éteint. Quoi qu'il en soit voici les deux endroits que je Compilé en ligne:Résultats inattendus pour le projet Euler n ° 17 (Python 3 vs Python 2.7)

Bonne réponse, Mon Python 3 réponse, Mon Python 2.7 Réponse: 21124, 21224, 18632

Python 3:http://ideone.com/ugfSV1

Python 2.7: Je ne sais pas comment le partager, donc il vous suffit de copier et coller le code ci-dessous manuellement http://www.compileonline.com/execute_python_online.php

Voici mon algorithme:

import time 

start = time.time() 

singles = {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"} 

tens = {2: "twenty", 
     3: "thirty", 
     4: "fourty", 
     5: "fifty", 
     6: "sixty", 
     7: "seventy", 
     8: "eighty", 
     9: "ninety"} 

hundred = "hundred" 
count = 0 

for num in range(1001): 

    if len(str(num)) == 4: 
     word = "onethousand" 

    elif len(str(num)) == 3: 
     first = singles[num // 100] + hundred 

     if num % 100 == 0: 
      first = singles[num // 100] + hundred 
      second = "" 

     elif num % 100 < 20: 
      first += "and" 
      second = singles[num % 100] 

     elif num % 100 < 100: 
      first += "and" 
      second = tens[(num % 100) // 10] 

     if isinstance(((num % 100)/10), float) and (num % 100 > 20): 
      third = singles[(num % 100) % 10] 
     else: 
      third = "" 

     word = first + second + third 

    elif len(str(num)) == 2: 
     if num > 19: 
      first = tens[num // 10] 
      second = singles[num % 10] 
      word = first + second 
     else: 
      word = singles[num] 

    elif len(str(num)) == 1: 
     word = singles[num] 

    print(word) 
    count += len(word) 

print("The total number of letters in all words from 1 to 1000 is: {}".format(
    count)) 

print("Time: {}".format(time.time() - start)) 
+0

' "quarante"' ne devrait pas avoir 'u' .. – DSM

+0

@DSM Incroyable lol merci beaucoup. –

Répondre

3

isinstance(((num % 100)/10), float) est toujours vrai sur Python 3 et toujours faux sur Python 2 (en supposant num est int). Voir PEP 238 à propos de ce changement.

+0

Pourquoi est-ce toujours faux sur Python 2? Et toute idée d'où viennent les 100 caractères supplémentaires pour Python 3? –

+0

Python 2 fait une division entière sur ints. – wRAR

+0

Oh. Merci de le signaler –

-1

Quelques erreurs.

"quarante" et non "fourty"

"mille" non "onethousand"

"twentyone" non "twentyone" vous n'avez pas logique d'insérer des traits d'union

« cent "non « Onehundred » et votre logique ne pad pas autour et avec des espaces

« cent un nouveau » non « onehundredandone », la logique manquante i espaces nsert

"deux cent un" logique manque pas "twohundredone" pour insérer et pour 200-999

+1

C'est exprès. Project Euler spécifie d'ignorer les espaces et les traits d'union alors pourquoi devrais-je prendre le temps de les ajouter? La seule vraie erreur est "quarante". En outre, le "et" est là ... Pas sûr pourquoi vous ne les voyez pas –

+0

Vous le faites de la bonne façon, car il est plus utile et agréable. Oui, vous ne les comptez pas non plus pour le problème indiqué. –

+0

Savez-vous ce qu'est le projet Euler? Je n'essaie pas de l'utiliser pour autre chose, et même si j'avais un usage pour cet outil, je perdrais du temps à essayer de réinventer quelque chose qui existe déjà. Encore une fois, mon code est correct pour le problème moins l'erreur d'orthographe dans "fourty" qui a été souligné dans un commentaire il ya longtemps –