Pourquoi ce code génère 8 au lieu de 5

la programmation


J’essaie de résoudre un problème HackerRank où je dois concaténer les éléments de date en un seul entier et vérifier si le nombre formé par la concaténation est divisible par 4 ou par 7. J’utilise une boucle while pour parcourir les dates entre les dates données mais mon code imprime 8 au lieu de 5 sur le terminal pour le scénario de test avec la date de début “02-08-2025” et la date de fin “04-09-2025”. Les deux dates sont inclusives

Ce que j’ai essayé :

C#
public class Solution{
static void Main(string args[]){
     //read date from the user
     var input = Console.ReadLine();
     var date1 = input.Split(new char[]{' '})[0];
     var date2 = input.Split(new char[]{' '})[1];
     //Parse date objects out of the strings
     DateTime A = DateTime.Parse(date1);
     DateTime B = DateTime.Parse(date2);
     int lucky = 0;
     while(A<= B){
           //Get a string representation of the date and    //replace the hyphens
           var str = A.ToString("dd-MM-yyyy").Replace("-","");
            var i = Int32.Parse(str);
            if(i%4==0 || i%7 ==0)
                lucky ++;
            
         //Update the day A
         A = A.AddDays(1);
        }
        Console.WriteLine(lucky);
    }

}

Solution 1

Je ne connais pas Hacker Rank, c’est pourquoi il y a beaucoup trop d’hypothèses dans ma réponse, désolé pour ça. D’ailleurs. voir aussi les commentaires à la question.

Hypothèse : Hacker Rank fonctionne sur un système d’exploitation américain et prendra donc par exemple pour la date l’analyse des conventions américaines pour la date qui est “mm/jj/aaaa” et par hasard, cela fonctionne avec votre intervalle de test sans exception. Dans le cas où vous entreriez par exemple « 29-12-2025 31-12-2025 », votre implémentation actuelle dans la question lèvera une exception.

Hacker Rank demande explicitement de fournir la date sous la forme « jj/mm/aaaa ».

Conclusion:
Au lieu d’utiliser simplement DateTime.Parse qui utilise les paramètres du système d’exploitation, vous devez utiliser une méthode plus spécifique comme DateTime.ParseExact

Enfin en utilisant…
DateTime A = DateTime.ParseExact(date1, "dd-MM-yyyy", null);
DateTime B = DateTime.ParseExact(date2, "dd-MM-yyyy", null);

… devrait résoudre votre problème.

Note:
Avec DateTime.TryParseExact vous pouvez analyser une date sans lever d’exception au cas où une date non valide aurait été saisie. Il vous appartient alors de gérer cette situation dans le code.

J’espère que cela vous aidera et désolé pour mon anglais 😉

Solution 2

Je suggérerais de faire quelque chose dans ce sens.

C#
string[] input = "02-08-2025 04-09-2025".Split(' ');
DateTime startDate = DateTime.Parse(input[0]);
DateTime endDate = DateTime.Parse(input[1]);
int luckyNumberCount = 0;
for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
{
    var n = int.Parse(date.ToString("dd-MM-yyyy").Replace("-", ""));
    if (n % 4 == 0 || n % 7 == 0) luckyNumberCount++;
}
Console.WriteLine(luckyNumberCount);
Console.ReadLine();

コメント

タイトルとURLをコピーしました