Mengapa kode ini menghasilkan 8 bukannya 5

pemrograman


Saya mencoba untuk mengatasi masalah HackerRank di mana saya diharuskan untuk menggabungkan elemen tanggal menjadi satu bilangan bulat dan memeriksa apakah angka yang dibentuk oleh penggabungan tersebut habis dibagi 4 atau 7. Saya menggunakan loop while untuk mengulangi tanggal di antara tanggal tanggal tertentu tetapi kode saya mencetak 8 bukannya 5 ke terminal untuk kasus uji dengan tanggal mulai “02-08-2025” dan tanggal akhir “09-04-2025”. Kedua tanggal tersebut bersifat inklusif

Apa yang saya coba:

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

}

Solusi 1

Saya tidak tahu Hacker Rank, itu sebabnya terlalu banyak asumsi dalam jawaban saya, maaf untuk itu. Omong-omong. lihat juga komentar untuk pertanyaan tersebut.

Asumsi: Peringkat Peretas berjalan pada OS AS dan oleh karena itu akan mengambil misalnya penguraian tanggal konvensi AS untuk tanggal yaitu ‘bb/dd/yyyy’ dan kebetulan ini berfungsi dengan interval pengujian Anda tanpa kecuali. Misalnya, jika Anda memasukkan ’29-12-2025 31-12-2025′ penerapan Anda saat ini dalam pertanyaan akan menimbulkan pengecualian.

Peringkat Peretas secara eksplisit meminta untuk memberikan tanggal sebagai ‘hh/bb/tttt’

Kesimpulan:
Daripada hanya menggunakan DateTime.Parse yang menggunakan pengaturan OS Anda perlu menggunakan metode yang lebih spesifik seperti DateTime.ParseExact

Akhirnya menggunakan…
DateTime A = DateTime.ParseExact(date1, "dd-MM-yyyy", null);
DateTime B = DateTime.ParseExact(date2, "dd-MM-yyyy", null);

… harus menyelesaikan masalah Anda.

Catatan:
Dengan DateTime.TryParseExact Anda dapat mengurai Tanggal tanpa mengeluarkan pengecualian jika tanggal yang dimasukkan tidak valid. Maka tugas Anda adalah menangani situasi ini dalam kode.

Saya harap ini membantu dan maaf untuk bahasa Inggris saya 😉

Solusi 2

Saya menyarankan melakukan sesuatu seperti ini.

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