Maison  >  Article  >  ProjectEuler Question 17 : J'ai modifié cette ligne de code et ma réponse a radicalement changé, même si je pensais que cela devrait fonctionner

ProjectEuler Question 17 : J'ai modifié cette ligne de code et ma réponse a radicalement changé, même si je pensais que cela devrait fonctionner

WBOY
WBOYavant
2024-02-13 20:51:08866parcourir

éditeur php Apple a rencontré une situation intéressante dans le numéro 17 de ProjectEuler. Après avoir modifié une ligne de code, il a constaté que la réponse avait radicalement changé, même s'il pensait que le code devrait fonctionner correctement. Cette question a piqué sa curiosité et il a commencé à en explorer les raisons et à chercher des solutions. Cette histoire est pleine de défis et de réflexions, ce qui incite les gens à attendre avec impatience la réponse de l'éditeur.

Contenu de la question

Je travaille sur le projet euler question 17. Je devrais écrire un programme pour compter le nombre total de caractères dans un nombre écrit de 1 à 1 000. Vous ignorez les espaces et les tirets. Selon la description du problème, des centaines de nombres incluent un « et » (trois cent quarante-deux). Mon code fonctionne dans la plupart des cas sauf pour les multiples de 100 (quand il calcule la "somme" supplémentaire). Par exemple, comptez 600 comme « six cent et ». Cela a fait que ma réponse s'écarte de 27 (3 sur 9 sur 100 chiffres). C'est presque la bonne solution :

string[] nums = {"",
                 "one",
                 "two",
                 "three",
                 "four",
                 "five",
                 "six",
                 "seven",
                 "eight",
                 "nine",
                 "ten",
                 "eleven",
                 "twelve",
                 "thirteen",
                 "fourteen",
                 "fifteen",
                 "sixteen",
                 "seventeen",
                 "eighteen",
                  "nineteen"};
string[] ten = {"",
                "",
                "twenty",
                "thirty",
                "forty",
                "fifty",
                "sixty",
                "seventy",
                "eighty",
                "ninety"};
int sum = 0;
map<integer, integer> ones = new hashmap<>();
map<integer, integer> teens = new hashmap<>();
map<integer, integer> tens = new hashmap<>();
for (int i = 0; i < 10; i++) {
    ones.put(i, nums[i].length());
}
for (int i = 10; i < nums.length; i++) {
    teens.put(i, nums[i].length());
}
for (int i = 0; i < ten.length; i++) {
    tens.put(i * 10, ten[i].length());
}
for (int i = 1; i < 1000; i++) {
    int num = 0;
    int n = i % 100;
    if (n > 19 || n < 10) {
        num += ones.get(n % 10);
        num += tens.get(n - n % 10);
    }
    else {
        num += teens.get(n);
    }
    num += i > 99 ? "hundredand".length() : 0;
    num += ones.get(i / 100);
    system.out.println(num + " " + i);
    sum += num;
}
sum += ("onethousand").length();
// actual is 21124
system.out.println(sum);

Cela donne une sortie de 21151, ce qui est 27 différent de la sortie attendue de 21124. La variable num est utilisée à des fins de débogage.

J'ai essayé de changer l'une des lignes de la boucle et j'ai ajouté une déclaration supplémentaire :

num += i>99 ? "hundred".length() : 0;
num += i%100==0 ? 3 : 0;

Après avoir exécuté cette version mise à jour, la sortie est 18487. Je ne sais pas pourquoi cette différence est si frappante et j'aimerais comprendre d'où cela vient. J'ai d'abord pensé que c'était à cause de l'opérateur ternaire, puisque ma connaissance de celui-ci est limitée. De plus, toutes les suggestions visant à rendre le code plus efficace sont les bienvenues. J'aimerais saisir sum-27 avant d'imprimer, mais j'ai l'impression que c'est un peu tricher :). Merci!

Solution de contournement

Comme d'autres l'ont dit dans les commentaires sur votre question, votre problème est de savoir comment votre code gère les nombres multiples de 100. Vous ajoutez toujours cent et jamais seulement centum>. En fait, vous vous êtes indiqué dans votre question :

Dans le code ci-dessous, j'utilise une instruction if explicite - au lieu de l'opérateur ternaire - car je pense que cela rend le code plus facile à comprendre lors de la lecture. Veuillez noter que c'est la seule modification que j'ai apportée au code publié dans votre question.

import java.util.hashmap;
import java.util.map;

public class myclass {
    public static void main(string args[]) {
        string[] nums = {"",
                         "one",
                         "two",
                         "three",
                         "four",
                         "five",
                         "six",
                         "seven",
                         "eight",
                         "nine",
                         "ten",
                         "eleven",
                         "twelve",
                         "thirteen",
                         "fourteen",
                         "fifteen",
                         "sixteen",
                         "seventeen",
                         "eighteen",
                         "nineteen"};
        string[] ten = {"",
                        "",
                        "twenty",
                        "thirty",
                        "forty",
                        "fifty",
                        "sixty",
                        "seventy",
                        "eighty",
                        "ninety"};
        int sum = 0;
        map<integer, integer> ones = new hashmap<>();
        map<integer, integer> teens = new hashmap<>();
        map<integer, integer> tens = new hashmap<>();
        for (int i = 0; i < 10; i++) {
            ones.put(i, nums[i].length());
        }
        for (int i = 10; i < nums.length; i++) {
            teens.put(i, nums[i].length());
        }
        for (int i = 0; i < ten.length; i++) {
            tens.put(i * 10, ten[i].length());
        }
        for (int i = 1; i < 1000; i++) {
            int num = 0;
            int n = i % 100;
            if (n > 19 || n < 10) {
                num += ones.get(n % 10);
                num += tens.get(n - n % 10);
            }
            else {
                num += teens.get(n);
            }
            if (i > 99) {
                num += n == 0 ? "hundred".length() : "hundredand".length();
            }
            num += ones.get(i / 100);
            sum += num;
//            system.out.printf("%2d %3d %5d%n", num, i, sum);
        }
        sum += ("onethousand").length();
        // actual is 21124
        system.out.println(sum);
    }
}

Lorsque j'exécute le code ci-dessus, j'obtiens les résultats suivants :

21124

Dans le code de votre question, vous avez écrit (dans les commentaires du code) que c'est la réponse attendue.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer