C++中日期類的常見題目合集分享
求1+2+3+…+n
題目:
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。
數(shù)據(jù)范圍: 0<n≤200
進階: 空間復雜度 O(1) ,時間復雜度O(n)
示例1:
輸入:5
返回值:15
示例2:
輸入:1
返回值:1
思路一:
根據(jù)我們剛學的內(nèi)部類的方法進行求解,通過調(diào)用n次構造函數(shù)來計算和,從_i = 1開始計算,每調(diào)用一次構造函數(shù)_i++一次,一共調(diào)用n次構造函數(shù),也就計算出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:
//構造函數(shù)
Sum()
{
_sum += _i;
_i++;
}
//對靜態(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;時間復雜度:O(1)
空間復雜度:O(N)
計算日期到天數(shù)轉(zhuǎn)換
題目:
根據(jù)輸入的日期,計算是這一年的第幾天。
保證年份為4位數(shù)且日期合法。
進階:時間復雜度:O*(*n) ,空間復雜度:O(1)
輸入描述:輸入一行,每行空格分割,分別是年,月,日
輸出描述:輸出是這一年的第幾天
示例1:
輸入:2012 12 31
輸出:366
示例2:
輸入:1982 3 4
輸出:63
思路一:
將每個月的天數(shù)使用數(shù)組存儲起來,然后將前n-1個月份的天數(shù)相加再加上第n月的天數(shù)即是總的天數(shù)。此外要注意2月份的天數(shù)變化。
代碼:
#include <iostream>
using namespace std;
int GetDay(int year, int month)
{
//將每個月的天數(shù)存儲起來
int monthday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//當月份為2月且為閏年時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;
}時間復雜度:O(N)
空間復雜度:O(1)
思路二:
直接將前n個月份合計天數(shù)放到數(shù)組中,然后計算。
代碼:
#include <iostream>
using namespace std;
int GetDay(int year,int month)
{
//將前n個月的天數(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;
//計算總共的天數(shù)
int num = GetDay(year, month-1) + day;
cout << num << endl;
return 0;
}時間復雜度:O(1)
空間復雜度:O(1)
日期差值
題目:
有兩個日期,求兩個日期之間的天數(shù),如果兩個日期是連續(xù)的我們規(guī)定他們之間的天數(shù)為兩天。
輸入描述:有多組數(shù)據(jù),每組數(shù)據(jù)有兩行,分別表示兩個日期,形式為YYYYMMDD
輸出描述:每組數(shù)據(jù)輸出一行,即日期差值
示例1:
輸入:20110412
20110422
輸出:11
思路一:
當我們要計算同年同月不同天的日期差值時,只需要相減之后再加1即可;計算同年不同月的日期,先將小日期的當月天數(shù)加進去然后再計算日期之間的差值;不同年的時候直接按照年的天數(shù)相加直至年份相等,然后再進行月份相隔天數(shù)的計算。
代碼:
#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;
//當年月日都相同時返回0
if (year1 == year2 && month1 == month2 && day1 == day2)
cout << "0" << endl;
//當年月相同日不同時返回
else if (year1 == year2 && month1 == month2)
cout << (day2 - day1) + 1 << endl;
//當年相同其他都不相同時
else if (year1 == year2) {
int sum = 0;
while (month1 != month2) {
sum += GetDay(year1, month1);
month1++;
}
sum = sum + day2 - day1 + 1;
cout << sum << endl;
}
//當年月日都不相同時
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;
}時間復雜度:O(N)
空間復雜度:O(1)
打印日期
題目:
給出年分m和一年中的第n天,算出第n天是幾月幾號。
輸入描述:輸入包括兩個整數(shù)y(1<=y<=3000),n(1<=n<=366)。
輸出描述:可能有多組測試數(shù)據(jù),對于每組數(shù)據(jù), 按 yyyy-mm-dd的格式將輸入中對應的日期打印出來。
示例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
思路:
將每個月的天數(shù)存到數(shù)組中,按照1月份開始往后計算。
代碼:
#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;
}時間復雜度:O(N)
空間復雜度:O(1)
日期累加
題目:
設計一個程序能計算一個日期加上若干天后是什么日期。
輸入描述:輸入第一行表示樣例個數(shù)m,接下來m行每行四個整數(shù)分別表示年月日和累加的天數(shù)。
輸出描述:輸出m行,每行按yyyy-mm-dd的個數(shù)輸出。
示例:
輸入:
1
2008 2 3 100
輸出:
2008-05-13
思路:
先將日期和要累加的天數(shù)相加然后通過比較當月日期是否合法,逐漸向后減。
代碼:
#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 };
//當月份為2月且1是閏年時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);
}
}
}時間復雜度:O(N)
空間復雜度:O(1)
以上就是C++中日期類的常見題目合集分享的詳細內(nèi)容,更多關于C++日期類的資料請關注腳本之家其它相關文
相關文章
C/C++中的mem函數(shù)和strcopy函數(shù)的區(qū)別和應用
strcpy和memcpy都是標準C庫函數(shù),strcpy提供了字符串的復制而memcpy提供了一般內(nèi)存的復制。下面通過本文重點給大家介紹C/C++中的mem函數(shù)和strcopy函數(shù)的區(qū)別和應用,非常不錯,感興趣的朋友一起看下吧2016-08-08
C++實現(xiàn)LeetCode(162.求數(shù)組的局部峰值)
這篇文章主要介紹了C++實現(xiàn)LeetCode(162.求數(shù)組的局部峰值),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
C++高級數(shù)據(jù)結(jié)構之優(yōu)先隊列
這篇文章主要介紹了C++高級數(shù)據(jù)結(jié)構之優(yōu)先隊列,文章圍繞主題的相關資料展開詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-05-05

