Date类型的OJ
- 一,static成员
- 二,DateOJ题
- 一,[计算日期到天数转换](https://www.nowcoder.com/practice/769d45d455fe40b385ba32f97e7bcded?tpId=37&&tqId=21296&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking)
- 二,[日期差值](https://www.nowcoder.com/practice/ccb7383c76fc48d2bbc27a2a6319631c?tpId=62&&tqId=29468&rp=1&ru=)
- 三,[打印日期](https://www.nowcoder.com/practice/b1f7a77416194fd3abd63737cdfcf82b?tpId=69&&tqId=29669&rp=1&ru=/activity/oj&qru=/ta/hust-kaoyan/question-ranking)
- 四,[日期累加](https://www.nowcoder.com/practice/eebb2983b7bf40408a1360efb33f9e5d?tpId=40&&tqId=31013&rp=1&ru=/activity/oj&qru=/ta/kaoyan/question-ranking)
一,static成员
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。
特点:
- 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
- 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
- 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
- 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
- 静态成员也是类的成员,受public、protected、private 访问限定符的限制
例题
class Sum
{
public:
Sum()
{
_ret+=_i;
_i++;
}
static int GetSum()
{
return _ret;
}
private:
static int _i;
static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;
class Solution {
public:
int Sum_Solution(int n) {
Sum sun[n];
return Sum::GetSum();
}
};
因为static定义的变量是所有成员共同拥有的,所以要计算n次,那么就调用n次的构造即可。
二,DateOJ题
一,计算日期到天数转换
1.1分析
从题目要求出发,我们先计算给出的月份距离一月的天数,然后再加上day。我们这里计算月份的天数可以用数组来计算。
1.2代码
#include <iostream>
using namespace std;
int main() {
int year,month,day;
cin>>year>>month>>day;
int GetDay[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};
int n=GetDay[month-1]+day;
if(month > 2 && ((year%4==0 && year%100!=0)||(year%400==0)))
{
n+=1;
}
cout<<n<<endl;
}
二,日期差值
2.1分析
我们有了上一题的代码,我们就可以先算出两个(month+day)的差值然后再计算year之间的差。
2.2代码
#include <iostream>
using namespace std;
int Getday(int year, int month,int day)
{
int GetDay[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};
int n=GetDay[month-1]+day;
if(month > 2 && ((year%4==0 && year%100!=0)||(year%400==0)))
{
n+=1;
}
return n;
}
int main() {
int year1,month1,day1;
int year2,month2,day2;
int ret=0;
while (scanf("%04d%02d%02d\n%04d%02d%02d", &year1, &month1, &day1, &year2, &month2, &day2) != EOF)
{
int num1=Getday(year1,month1,day1);
int num2=Getday(year2,month2,day2);
int ret=0;
if(num1>num2)
{
ret=num1-num2;
}
else {
ret=num2-num1;
}
int max=year1,min=year2;
if(max<year2)
{
max=year2;
min=year1;
}
while(min!=max)
{
if((min%4==0 && min%100!=0)||(min%400==0))
{
ret+=366;
}
else {
ret+=365;
}
min++;
}
cout<<ret+1<<endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
三,打印日期
3.1分析
第n天减去每个月份的天数,然后月份++
3.2代码
#include <iostream>
using namespace std;
int dayTab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int IsLeapYear(int year) { //是否为闰年
if((year % 4 == 0 && year % 100 != 0 ) || (year % 400 == 0))
{
return 1;
}
else {
return 0;
}
}
int main() {
int year, month, day, number;
while (scanf("%d%d", &year, &number) != EOF) {
month=0;
int row =IsLeapYear(year);
while(number>dayTab[row][month])
{
number-=dayTab[row][month];
month++;
}
day=number;
printf("%04d-%02d-%02d\n",year,month,day);
}
return 0;
}
// 64 位输出请用 printf("%lld")
四,日期累加
4.1分析
这个题和上面的打印日期非常的像,我们多加一个year的考虑即可
4.2代码
#include <iostream>
using namespace std;
int dayTab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int IsLeapYear(int year) { //是否为闰年
if((year % 4 == 0 && year % 100 != 0 ) || (year % 400 == 0))
{
return 1;
}
else {
return 0;
}
}
int main() {
int year, month, day, n, number;
scanf("%d", &n);
while (n--) {
scanf("%d %d %d %d", &year, &month, &day, &number);
day+=number;
int row =IsLeapYear(year);
while(day>dayTab[row][month])
{
day-=dayTab[row][month];
month++;
if(month>12)
{
month=1;
year++;
row =IsLeapYear(year);
}
}
printf("%04d-%02d-%02d\n",year,month,day);
}
}
// 64 位输出请用 printf("%lld")