C++中日期類的常見題目合集分享
求1+2+3+…+n
題目:
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關(guān)鍵字及條件判斷語句(A?B:C)。
數(shù)據(jù)范圍: 0<n≤200
進(jìn)階: 空間復(fù)雜度 O(1) ,時(shí)間復(fù)雜度O(n)
示例1:
輸入:5
返回值:15
示例2:
輸入:1
返回值:1
思路一:
根據(jù)我們剛學(xué)的內(nèi)部類的方法進(jìn)行求解,通過調(diào)用n次構(gòu)造函數(shù)來計(jì)算和,從_i = 1開始計(jì)算,每調(diào)用一次構(gòu)造函數(shù)_i++一次,一共調(diào)用n次構(gòu)造函數(shù),也就計(jì)算出1+2+……+n。
代碼一:使用內(nèi)部類和靜態(tài)成員變量的方法
#include <unistd.h> class Solution { public: class Sum{ public: Sum() { _sum += _i; _i++; } }; int Sum_Solution(int n) { Sum a[n]; return _sum; } private: static int _i; static int _sum; }; int Solution::_i = 1; int Solution::_sum = 0;
代碼二:使用靜態(tài)成員函數(shù)和靜態(tài)成員變量
class Sum{ public: //構(gòu)造函數(shù) Sum() { _sum += _i; _i++; } //對(duì)靜態(tài)成員變量初始化 static void Init() { _i = 1; _sum = 0; } //獲取成員變量的值 static int GetSum() { return _sum; } private: static int _i; static int _sum; }; class Solution { public: int Sum_Solution(int n) { Sum::Init(); //Sum a[n];//變長數(shù)組 Sum* p = new Sum[n]; return Sum::GetSum(); } }; //靜態(tài)成員變量的定義 int Sum::_i = 1; int Sum::_sum = 0;
時(shí)間復(fù)雜度:O(1)
空間復(fù)雜度:O(N)
計(jì)算日期到天數(shù)轉(zhuǎn)換
題目:
根據(jù)輸入的日期,計(jì)算是這一年的第幾天。
保證年份為4位數(shù)且日期合法。
進(jìn)階:時(shí)間復(fù)雜度:O*(*n) ,空間復(fù)雜度:O(1)
輸入描述:輸入一行,每行空格分割,分別是年,月,日
輸出描述:輸出是這一年的第幾天
示例1:
輸入:2012 12 31
輸出:366
示例2:
輸入:1982 3 4
輸出:63
思路一:
將每個(gè)月的天數(shù)使用數(shù)組存儲(chǔ)起來,然后將前n-1個(gè)月份的天數(shù)相加再加上第n月的天數(shù)即是總的天數(shù)。此外要注意2月份的天數(shù)變化。
代碼:
#include <iostream> using namespace std; int GetDay(int year, int month) { //將每個(gè)月的天數(shù)存儲(chǔ)起來 int monthday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; //當(dāng)月份為2月且為閏年時(shí)2月份有29天 if (month == 2) { if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) { return monthday[month] + 1; } } return monthday[month]; } int main() { int year; int day; int month; cin >> year >> month >> day; if (year < 1000 || year > 9999 || month > 13 || day <= 0 || day > GetDay(year,month) ) { exit(0); } int sum = 0; //將前n-1月的天數(shù)相加 while (month--) { sum += GetDay(year, month); } //加上本月的天數(shù) sum += day; cout << sum << endl; return 0; }
時(shí)間復(fù)雜度:O(N)
空間復(fù)雜度:O(1)
思路二:
直接將前n個(gè)月份合計(jì)天數(shù)放到數(shù)組中,然后計(jì)算。
代碼:
#include <iostream> using namespace std; int GetDay(int year,int month) { //將前n個(gè)月的天數(shù)之和算出來 int arr[12]={0,31,59,90,120,151,181,212,243,273,304,334}; //判斷是否是閏年 if((month >= 2) && (year % 400 == 0 || year%4 == 0 && year %100 != 0)) { return arr[month]+1; } return arr[month]; } int main() { int year,month,day; cin >> year >> month >> day; //計(jì)算總共的天數(shù) int num = GetDay(year, month-1) + day; cout << num << endl; return 0; }
時(shí)間復(fù)雜度:O(1)
空間復(fù)雜度:O(1)
日期差值
題目:
有兩個(gè)日期,求兩個(gè)日期之間的天數(shù),如果兩個(gè)日期是連續(xù)的我們規(guī)定他們之間的天數(shù)為兩天。
輸入描述:有多組數(shù)據(jù),每組數(shù)據(jù)有兩行,分別表示兩個(gè)日期,形式為YYYYMMDD
輸出描述:每組數(shù)據(jù)輸出一行,即日期差值
示例1:
輸入:20110412
20110422
輸出:11
思路一:
當(dāng)我們要計(jì)算同年同月不同天的日期差值時(shí),只需要相減之后再加1即可;計(jì)算同年不同月的日期,先將小日期的當(dāng)月天數(shù)加進(jìn)去然后再計(jì)算日期之間的差值;不同年的時(shí)候直接按照年的天數(shù)相加直至年份相等,然后再進(jìn)行月份相隔天數(shù)的計(jì)算。
代碼:
#include <iostream> using namespace std; //獲取月份天數(shù) int GetDay(int year, int month) { int monthday[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (month == 2) { if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) { return monthday[month] + 1; } } return monthday[month]; } int main() { int n1; int n2; while (cin >> n1 >> n2) { //確保日期n1小于日期n2 if(n1 > n2) { int tmp = n1; n1 = n2; n2 = tmp; ??????? } //將日期按照年月日分割 int day1 = n1 % 100; int day2 = n2 % 100; n1 = n1 / 100; n2 = n2 / 100; int month1 = n1 % 100; int month2 = n2 % 100; n1 = n1 / 100; n2 = n2 / 100; int year1 = n1; int year2 = n2; //當(dāng)年月日都相同時(shí)返回0 if (year1 == year2 && month1 == month2 && day1 == day2) cout << "0" << endl; //當(dāng)年月相同日不同時(shí)返回 else if (year1 == year2 && month1 == month2) cout << (day2 - day1) + 1 << endl; //當(dāng)年相同其他都不相同時(shí) else if (year1 == year2) { int sum = 0; while (month1 != month2) { sum += GetDay(year1, month1); month1++; } sum = sum + day2 - day1 + 1; cout << sum << endl; } //當(dāng)年月日都不相同時(shí) else { int sum = 0; while (year1 != year2) { if (year1 % 400 == 0 || (year1 % 4 == 0 && year1 % 100 != 0)) { sum += 366; } else { sum += 365; } year1++; } while (month1 != month2) { sum += GetDay(year1, month1); month1++; } sum = sum + day2 - day1 + 1; cout << sum << endl; } } return 0; }
時(shí)間復(fù)雜度:O(N)
空間復(fù)雜度:O(1)
打印日期
題目:
給出年分m和一年中的第n天,算出第n天是幾月幾號(hào)。
輸入描述:輸入包括兩個(gè)整數(shù)y(1<=y<=3000),n(1<=n<=366)。
輸出描述:可能有多組測試數(shù)據(jù),對(duì)于每組數(shù)據(jù), 按 yyyy-mm-dd的格式將輸入中對(duì)應(yīng)的日期打印出來。
示例1:
輸入:
2000 3
2000 31
2000 40
2000 60
2000 61
2001 60
輸出:
2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01
思路:
將每個(gè)月的天數(shù)存到數(shù)組中,按照1月份開始往后計(jì)算。
代碼:
#include <iostream> using namespace std; int main() { int year,n; int monthday[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; while(cin >> year >> n) { int month = 1;//month從1月份開始 int day = n; //判斷是否是閏年 if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) { monthday[2] += 1;//閏年2月份為29天 } //判斷天數(shù) while(day > monthday[month]) { day = day - monthday[month]; month++; } printf("%d-%02d-%02d\n", year, month, day); } return 0; }
時(shí)間復(fù)雜度:O(N)
空間復(fù)雜度:O(1)
日期累加
題目:
設(shè)計(jì)一個(gè)程序能計(jì)算一個(gè)日期加上若干天后是什么日期。
輸入描述:輸入第一行表示樣例個(gè)數(shù)m,接下來m行每行四個(gè)整數(shù)分別表示年月日和累加的天數(shù)。
輸出描述:輸出m行,每行按yyyy-mm-dd的個(gè)數(shù)輸出。
示例:
輸入:
1
2008 2 3 100
輸出:
2008-05-13
思路:
先將日期和要累加的天數(shù)相加然后通過比較當(dāng)月日期是否合法,逐漸向后減。
代碼:
#include <iostream> using namespace std; //獲取當(dāng)前月份的天數(shù) int GetDay(int year, int month) { int monthday[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; //當(dāng)月份為2月且1是閏年時(shí)2月份有31天 if(month == 2) { if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) { return monthday[month]+1; } } return monthday[month]; } int main() { int m = 0; cin >> m; for(int i = 0; i < m; i++) { int year,month,day,n; while(cin >> year >> month >> day >> n) { day = day + n; while(day > GetDay(year, month)) { day = day - GetDay(year, month); month++; if(month > 12) { year++; month = 1; } } printf("%d-%02d-%02d\n",year,month,day); } } }
時(shí)間復(fù)雜度:O(N)
空間復(fù)雜度:O(1)
以上就是C++中日期類的常見題目合集分享的詳細(xì)內(nèi)容,更多關(guān)于C++日期類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文
相關(guān)文章
C/C++中的mem函數(shù)和strcopy函數(shù)的區(qū)別和應(yīng)用
strcpy和memcpy都是標(biāo)準(zhǔn)C庫函數(shù),strcpy提供了字符串的復(fù)制而memcpy提供了一般內(nèi)存的復(fù)制。下面通過本文重點(diǎn)給大家介紹C/C++中的mem函數(shù)和strcopy函數(shù)的區(qū)別和應(yīng)用,非常不錯(cuò),感興趣的朋友一起看下吧2016-08-08C++實(shí)現(xiàn)LeetCode(162.求數(shù)組的局部峰值)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(162.求數(shù)組的局部峰值),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07VC實(shí)現(xiàn)給窗體的一個(gè)按鈕添加事件的方法
這篇文章主要介紹了VC實(shí)現(xiàn)給窗體的一個(gè)按鈕添加事件的方法,通過三個(gè)簡單步驟實(shí)現(xiàn)窗體按鈕添加事件,需要的朋友可以參考下2015-05-05C++實(shí)現(xiàn)移動(dòng)立方體示例講解
這篇文章主要介紹了C++實(shí)現(xiàn)移動(dòng)立方體,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12詳解C++中vector的理解以及模擬實(shí)現(xiàn)
vector是表示可變大小數(shù)組的序列容器。這篇文章主要為大家詳細(xì)介紹了vector的理解以及模擬實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-03-03Qt 信號(hào)自定義槽函數(shù)的實(shí)現(xiàn)
Qt中實(shí)現(xiàn)自定義信號(hào)與槽函數(shù),信號(hào)用于發(fā)送并觸發(fā)槽函數(shù),槽函數(shù)則是具體的功能實(shí)現(xiàn),本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下2021-11-11C++高級(jí)數(shù)據(jù)結(jié)構(gòu)之優(yōu)先隊(duì)列
這篇文章主要介紹了C++高級(jí)數(shù)據(jù)結(jié)構(gòu)之優(yōu)先隊(duì)列,文章圍繞主題的相關(guān)資料展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05