为什么这段代码输出 8 而不是 5


我正在尝试解决 HackerRank 问题,其中需要将日期元素连接成单个整数,并检查连接形成的数字是否能被 4 或 7 整除。我正在使用 while 循环来迭代给定日期,但我的代码在测试用例的终端上打印 8 而不是 5,开始日期为“02-08-2025”,结束日期为“04-09-2025”。 两个日期均包含在内

我尝试过的:

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);
    }

}

解决方案1

我不知道黑客等级,这就是为什么我的答案中有太多假设,对此感到抱歉。 顺便提一句。 另请参阅对该问题的评论。

假设:Hacker Rank 在美国操作系统上运行,因此将采用例如日期来解析美国约定的日期,即“mm/dd/yyyy”,并且碰巧这适用于您的测试间隔,无一例外。 如果您输入“29-12-2025 31-12-2025”,问题中当前的实现将引发异常。

Hacker Rank 明确要求提供“dd/mm/yyyy”格式的日期

结论:
而不是简单地使用 DateTime.Parse 它使用操作系统设置,您需要使用更具体的方法,例如 DateTime.ParseExact

最后使用…
DateTime A = DateTime.ParseExact(date1, "dd-MM-yyyy", null);
DateTime B = DateTime.ParseExact(date2, "dd-MM-yyyy", null);

…应该可以解决你的问题。

笔记:
DateTime.TryParseExact 如果输入了无效日期,您可以解析日期而不引发异常。然后您的工作就是在代码中处理这种情况。

我希望它能有所帮助,对我的英语感到抱歉;)

解决方案2

我建议按照这些思路做一些事情。

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をコピーしました