目录
求1+2+3+…+n
题目:
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
数据范围: 0<n≤200
进阶: 空间复杂度 O(1) ,时间复杂度O(n)
示例1:
输入:5
返回值:15
示例2:
输入:1
返回值:1
思路一:
根据我们刚学的内部类的方法进行求解,通过调用n次构造函数来计算和,从_i = 1开始计算,每调用一次构造函数_i++一次,一共调用n次构造函数,也就计算出1+2+……+n。
代码一:使用内部类和静态成员变量的方法
#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;
代码二:使用静态成员函数和静态成员变量
class Sum{ public: //构造函数 Sum() { _sum += _i; _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];//变长数组 Sum* p = new Sum[n]; return Sum::GetSum(); } }; //静态成员变量的定义 int Sum::_i = 1; int Sum::_sum = 0;
时间复杂度:O(1)
空间复杂度:O(N)
计算日期到天数转换
题目:
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度:O*(*n) ,空间复杂度:O(1)
输入描述:输入一行,每行空格分割,分别是年,月,日
输出描述:输出是这一年的第几天
示例1:
输入:2012 12 31
输出:366
示例2:
输入:1982 3 4
输出:63
思路一:
将每个月的天数使用数组存储起来,然后将前n-1个月份的天数相加再加上第n月的天数即是总的天数。此外要注意2月份的天数变化。
代码:
#include <iostream> using namespace std; int GetDay(int year, int month) { //将每个月的天数存储起来 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月的天数相加 while (month--) { sum += GetDay(year, month); } //加上本月的天数 sum += day; cout << sum << endl; return 0; }
时间复杂度:O(N)
空间复杂度:O(1)
思路二:
直接将前n个月份合计天数放到数组中,然后计算。
代码:
#include <iostream> using namespace std; int GetDay(int year,int month) { //将前n个月的天数之和算出来 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; //计算总共的天数 int num = GetDay(year, month-1) + day; cout << num << endl; return 0; }
时间复杂度:O(1)
空间复杂度:O(1)
日期差值
题目:
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入描述:有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:每组数据输出一行,即日期差值
示例1:
输入:20110412
20110422
输出:11
思路一:
当我们要计算同年同月不同天的日期差值时,只需要相减之后再加1即可;计算同年不同月的日期,先将小日期的当月天数加进去然后再计算日期之间的差值;不同年的时候直接按照年的天数相加直至年份相等,然后再进行月份相隔天数的计算。
代码:
#include <iostream> using namespace std; //获取月份天数 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天是几月几号。
输入描述:输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:可能有多组测试数据,对于每组数据, 按 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
思路:
将每个月的天数存到数组中,按照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天 } //判断天数 while(day > monthday[month]) { day = day - monthday[month]; month++; } printf("%d-%02d-%02d\n", year, month, day); } return 0; }
时间复杂度:O(N)
空间复杂度:O(1)
日期累加
题目:
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述:输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述:输出m行,每行按yyyy-mm-dd的个数输出。
示例:
输入:
1
2008 2 3 100
输出:
2008-05-13
思路:
先将日期和要累加的天数相加然后通过比较当月日期是否合法,逐渐向后减。
代码:
#include <iostream> using namespace std; //获取当前月份的天数 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++中日期类的常见题目合集分享的详细内容,更多关于C++日期类的资料请关注其它相关文