Найдите количество дней между двумя заданными датами
Опубликовано: 21 Января, 2022
Учитывая две даты, найдите общее количество дней между ними. Количество дней должно быть рассчитано за O (1) время и O (1) во вспомогательном пространстве.
Примеры:
Ввод: dt1 = {10, 2, 2014} dt2 = {10, 3, 2015} Выход: 393 dt1 представляет «10 февраля 2014 года», а dt2 - «10 марта 2015 года». Разница 365 + 28 Ввод: dt1 = {10, 2, 2000} dt2 = {10, 3, 2000} Выход: 29 Обратите внимание, что 2000 год - високосный. Ввод: dt1 = {10, 2, 2000} dt2 = {10, 2, 2000} Выход: 0 Обе даты совпадают Ввод: dt1 = {1, 2, 2000}; dt2 = {1, 2, 2004}; Выход: 1461 Количество дней 365 * 4 + 1
Мы настоятельно рекомендуем вам щелкнуть здесь и попрактиковаться, прежде чем переходить к решению.
Одно наивное решение - начать с dt1 и продолжать считать дни, пока не будет достигнуто dt2. Это решение требует больше времени O (1).
Лучшее и простое решение - подсчитать общее количество дней до dt1, т.е. общее количество дней от 00/00/0000 до dt1, а затем подсчитать общее количество дней до dt2. Наконец, верните разницу между двумя счетчиками.
Пусть заданы две даты: «1 февраля 2000 года» и «1 февраля 2004 года». dt1 = {1, 2, 2000}; dt2 = {1, 2, 2004}; Подсчитайте количество дней до dt1. Пусть это количество равно n1. Каждый високосный год добавляет один дополнительный день (29 февраля) к общему количеству дней. n1 = 2000 * 365 + 31 + 1 + Количество високосных лет Можно рассчитать количество високосных лет для даты 'д / м / г' по следующей формуле: Количество високосных лет = этаж (y / 4) - этаж (y / 100) + этаж (y / 400), если m> 2 = этаж ((y-1) / 4) - этаж ((y-1) / 100) + этаж ((y-1) / 400), если m <= 2 Все указанные выше деления должны выполняться с использованием целочисленной арифметики. Так что остальное игнорируется. На 01.01.2000 високосный год: 1999/4 - 1999/100. + 1999/400, что составляет 499 - 19 + 4 = 484 Следовательно, n1 равно 2000 * 365 + 31 + 1 + 484 Аналогичным образом подсчитываем количество дней до dt2. Пусть это число равно n2. Наконец, верните n2-n1.
Below is the implementation of the above idea.
C++
// C++ program two find number of // days between two given dates #include <iostream> using namespace std; // A date has day "d", month "m" and year "y" struct Date { int d, m, y; }; // To store number of days in // all months from January to Dec. const int monthDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // This function counts number of // leap years before the given date int countLeapYears(Date d) { int years = d.y; // Check if the current year needs to be // considered for the count of leap years // or not if (d.m <= 2) years--; // An year is a leap year if it // is a multiple of 4, // multiple of 400 and not a // multiple of 100. return years / 4 - years / 100 + years / 400; } // This function returns number of // days between two given dates int getDifference(Date dt1, Date dt2) { // COUNT TOTAL NUMBER OF DAYS // BEFORE FIRST DATE "dt1" // initialize count using years and day long int n1 = dt1.y * 365 + dt1.d; // Add days for months in given date for ( int i = 0; i < dt1.m - 1; i++) n1 += monthDays[i]; // Since every leap year is of 366 days, // Add a day for every leap year n1 += countLeapYears(dt1); // SIMILARLY, COUNT TOTAL NUMBER OF // DAYS BEFORE "dt2" long int n2 = dt2.y * 365 + dt2.d; for ( int i = 0; i < dt2.m - 1; i++) n2 += monthDays[i]; n2 += countLeapYears(dt2); // return difference between two counts return (n2 - n1); } // Driver code int main() { Date dt1 = { 1, 2, 2000 }; Date dt2 = { 1, 2, 2004 }; // Function call cout << "Difference between two dates is " << getDifference(dt1, dt2); return 0; } |
Java
// Java program two find number of // days between two given dates class GFG { // A date has day "d", month "m" and year "y" static class Date { int d, m, y; public Date( int d, int m, int y) { this .d = d; this .m = m; this .y = y; } }; // To store number of days in // all months from January to Dec. static int monthDays[] = { 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 }; // This function counts number of // leap years before the given date static int countLeapYears(Date d) { int years = d.y; // Check if the current year needs to be considered // for the count of leap years or not if (d.m <= 2 ) { years--; } // An year is a leap year if it is a multiple of 4, // multiple of 400 and not a multiple of 100. return years / 4 - years / 100 + years / 400 ; } // This function returns number // of days between two given dates static int getDifference(Date dt1, Date dt2) { // COUNT TOTAL NUMBER OF DAYS BEFORE FIRST DATE "dt1" // initialize count using years and day int n1 = dt1.y * 365 + dt1.d; // Add days for months in given date for ( int i = 0 ; i < dt1.m - 1 ; i++) { n1 += monthDays[i]; } // Since every leap year is of 366 days, // Add a day for every leap year n1 += countLeapYears(dt1); // SIMILARLY, COUNT TOTAL NUMBER OF DAYS BEFORE "dt2" int n2 = dt2.y * 365 + dt2.d; for ( int i = 0 ; i < dt2.m - 1 ; i++) { n2 += monthDays[i]; } n2 += countLeapYears(dt2); // return difference between two counts return (n2 - n1); } // Driver code public static void main(String[] args) { Date dt1 = new Date( 1 , 2 , 2000 ); Date dt2 = new Date( 1 , 2 , 2004 ); System.out.println( "Difference between two dates is " + getDifference(dt1, dt2)); } } // This code is contributed by 29AjayKumar |
Python3
# Python3 program two find number of # days between two given dates # A date has day "d", month # "m" and year "y" class Date: def __init__( self , d, m, y): self .d = d self .m = m self .y = y # To store number of days in # all months from January to Dec. monthDays = [ 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 ] # This function counts number of # leap years before the given date def countLeapYears(d): years = d.y # Check if the current year needs # to be considered for the count # of leap years or not if (d.m < = 2 ): years - = 1 # An year is a leap year if it is a # multiple of 4, multiple of 400 and # not a multiple of 100. ans = int (years / 4 ) ans - = int (years / 100 ) ans + = int (years / 400 ) return ans # This function returns number of # days between two given dates def getDifference(dt1, dt2): # COUNT TOTAL NUMBER OF DAYS # BEFORE FIRST DATE "dt1" # initialize count using years and day n1 = dt1.y * 365 + dt1.d # Add days for months in given date for i in range ( 0 , dt1.m - 1 ): n1 + = monthDays[i] # Since every leap year is of 366 days, # Add a day for every leap year n1 + = countLeapYears(dt1) # SIMILARLY, COUNT TOTAL NUMBER # OF DAYS BEFORE "dt2" n2 = dt2.y * 365 + dt2.d for i in range ( 0 , dt2.m - 1 ): n2 + = monthDays[i] n2 + = countLeapYears(dt2) # return difference between # two counts return (n2 - n1) # Driver Code dt1 = Date( 1 , 9 , 2014 ) dt2 = Date( 3 , 9 , 2020 ) # Function call print ( "Difference between two dates is" , getDifference(dt1, dt2)) # This code is contributed by Smitha |
C#
// C# program two find number of // days between two given dates using System; class GFG { // A date has day "d", month "m" and year "y" public class Date { public int d, m, y; public Date( int d, int m, int y) { this .d = d; this .m = m; this .y = y; } }; // To store number of days in // all months from January to Dec. static int [] monthDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // This function counts number of // leap years before the given date static int countLeapYears(Date d) { int years = d.y; // Check if the current year // needs to be considered // for the count of leap years or not if (d.m <= 2) { years--; } // An year is a leap year if it is // a multiple of 4, multiple of 400 // and not a multiple of 100. return years / 4 - years / 100 + years / 400; } // This function returns number // of days between two given dates static int getDifference(Date dt1, Date dt2) { // COUNT TOTAL NUMBER OF DAYS // BEFORE FIRST DATE "dt1" // initialize count using years and day int n1 = dt1.y * 365 + dt1.d; // Add days for months in given date for ( int i = 0; i < dt1.m - 1; i++) { n1 += monthDays[i]; } // Since every leap year is of 366 days, // Add a day for every leap year n1 += countLeapYears(dt1); // SIMILARLY, COUNT TOTAL // NUMBER OF DAYS BEFORE "dt2" int n2 = dt2.y * 365 + dt2.d; for ( int i = 0; i < dt2.m - 1; i++) { n2 += monthDays[i]; } n2 += countLeapYears(dt2); // return difference between two counts return (n2 - n1); } // Driver code public static void Main(String[] args) { Date dt1 = new Date(1, 2, 2000); Date dt2 = new Date(1, 2, 2004); // Function call Console.WriteLine( "Difference between two dates is " + getDifference(dt1, dt2)); } } // This code is contributed by PrinciRaj1992 |
Output
Difference between two dates is 1461