Tại sao mã này xuất ra 8 thay vì 5

lập trình


Tôi đang cố gắng giải quyết một vấn đề HackerRank trong đó bắt buộc phải nối các phần tử ngày thành một số nguyên duy nhất và kiểm tra xem số được tạo bởi phép nối có chia hết cho 4 hoặc 7 hay không. Tôi đang sử dụng vòng lặp while để lặp qua các ngày giữa ngày đã cho nhưng mã của tôi đang in 8 thay vì 5 tới thiết bị đầu cuối cho trường hợp thử nghiệm có ngày bắt đầu là “02-08-2025” và ngày kết thúc “04-09-2025”. Cả hai ngày đều bao gồm

Những gì tôi đã thử:

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

}

Giải pháp 1

Tôi không biết Xếp hạng Hacker, đó là lý do tại sao câu trả lời của tôi lại có quá nhiều giả định, xin lỗi vì điều đó. Nhân tiện. xem thêm các ý kiến ​​​​cho câu hỏi.

Giả định: Hacker Rank chạy trên hệ điều hành Hoa Kỳ và do đó sẽ lấy ví dụ như phân tích ngày theo quy ước của Hoa Kỳ cho ngày là ‘mm/dd/yyyy’ và tình cờ điều này hoạt động với khoảng thời gian thử nghiệm của bạn mà không có ngoại lệ. Trong trường hợp bạn muốn nhập ’29-12-2025 31-12-2025′ thì việc triển khai hiện tại của bạn trong câu hỏi sẽ đưa ra một ngoại lệ.

Hacker Rank yêu cầu cung cấp ngày một cách rõ ràng là ‘dd/mm/yyyy’

Phần kết luận:
Thay vì chỉ sử dụng DateTime.Parse sử dụng cài đặt hệ điều hành, bạn cần sử dụng một phương pháp cụ thể hơn như DateTime.ParseExact

Cuối cùng sử dụng…
DateTime A = DateTime.ParseExact(date1, "dd-MM-yyyy", null);
DateTime B = DateTime.ParseExact(date2, "dd-MM-yyyy", null);

… sẽ giải quyết được vấn đề của bạn.

Ghi chú:
Với DateTime.TryParseExact bạn có thể phân tích cú pháp Ngày mà không đưa ra ngoại lệ trong trường hợp ngày không hợp lệ đã được nhập vào. Khi đó, công việc của bạn là xử lý tình huống này bằng mã.

Tôi hy vọng nó có ích và xin lỗi vì tiếng Anh của tôi;)

Giải pháp 2

Tôi khuyên bạn nên làm điều gì đó dọc theo những dòng này.

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