编程题:
题一:计算日期到天数的转换
计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com)
示例1
输入:
2012 12 31输出:
366
思路一:
第一步:创建年,月,日的变量,并按要求输入;
第二步:创建一个数组记录平年每个月的天数,以及记录总天数的sum;
第三步:将除当前月的以外的天数记录在sum中,再去判断是不是闰年,是就+1;
第四步:打印总天数。
#include <iostream>
using namespace std;int main()
{int _year,_month,_day;cin>>_year>>_month>>_day;int sum = _day;int arr[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};int n = _month;while(--n){sum += arr[n];}if(_month > 2 && ((_year % 4 == 0 && _year % 100 != 0) || (_year % 400 == 0)))sum += 1;cout<<sum<<endl;return 0;
}
思路二:
第一步:创建一个日期类:私有成员变量有:年,月,日;
第二步:创建一个构造函数,给自定义类型的对象完成初始化;创建一个赋值运算符重载" >> "保证自定义类型的输入;以及赋值运算符重载" << "自定义保证能够输出自定义类型的内容;需要注意的是" << " " >> "需要声明为友元函数,且在类外定义;最后再创建一个函数得到当前年这个月的天数;
第三步:根据题意将输入的年,月,日转换成是这一年的第几天;
#include <iostream>
using namespace std;class Date
{public://构造函数Date(int year = 1,int month = 1,int day = 1){_year = year;_month = month;_day = day;}//计算当前年月所对应的天数int GetMonth(int& year,int& month){int arr[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31};if(month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return arr[month];}//友元函数声明friend ostream& operator<<(ostream& out,Date& d);friend istream& operator>>(istream& out,Date& d);private:int _year;int _month;int _day;
};//赋值运算符重载
ostream& operator<<(ostream& out,Date& d)
{int sum = d._day;--d._month;while(d._month >0){sum += d.GetMonth(d._year, d._month);--d._month;}out<<sum<<endl; return out;
}
istream& operator>>(istream& in,Date& d)
{in>>d._year>>d._month>>d._day;return in;
}int main()
{Date d1;cin>>d1;cout<<d1<<endl;return 0;
}
题二:日期差值
日期差值_牛客题霸_牛客网 (nowcoder.com)
示例1
输入:
20110412 20110422输出:
11
思路一:
#include <iostream>
using namespace std;
#include <stdbool.h>class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}int GetMonth(int& year, int& month){int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return arr[month];}bool operator!=(Date& d){return !(_year == d._year && _month == d._month && _day == d._day);}bool operator<(Date& d){if (_year < d._year){return true;}else if (_year == d._year && _month < d._month){return true;}else if (_year == d._year && _month == d._month && _day < d._day){return true;}return false;}Date& operator++(){++_day;if (_day > GetMonth(_year, _month)){_day = _day - GetMonth(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}return *this;}int operator-(Date& d){//int flag = 1;Date max = *this;Date min = d;if (*this < d){max = d;min = *this;//flag = -1;}int n = 0;while (min != max){++min;++n;}return n + 1;}friend ostream& operator<<(ostream& out, Date& d);friend istream& operator>>(istream& out, Date& d);private:int _year;int _month;int _day;
};ostream& operator<<(ostream& out, Date& d)
{out << d._year << d._month << d._day << endl;return out;
}istream& operator>>(istream& in, Date& d)
{scanf("%4d%2d%2d", &d._year, &d._month, &d._day);return in;
}int main()
{Date d1;Date d2;cin >> d1;cin >> d2;cout << d1 - d2;return 0;
}
// 64 位输出请用 printf("%lld")
题三:打印日期
打印日期_牛客题霸_牛客网 (nowcoder.com)
示例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
思路一:
#include <iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}int GetMonth(int& year, int& month){int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return arr[month];}void Calendar(){while (_day > GetMonth(_year, _month)){_day = _day - GetMonth(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}}friend ostream& operator<<(ostream& out, Date& d);friend istream& operator>>(istream& out, Date& d);private:int _year;int _month;int _day;
};ostream& operator<<(ostream& out, Date& d)
{printf("%04d-%02d-%02d", d._year, d._month, d._day);return out;
}
istream& operator>>(istream& in, Date& d)
{scanf("%4d%d", &d._year, &d._day);return in;
}int main()
{Date d1;cin >> d1;d1.Calendar();cout << d1;return 0;
}
// 64 位输出请用 printf("%lld")
题四:日期累加
日期累加_牛客题霸_牛客网 (nowcoder.com)
示例1
输入:
1 2008 2 3 100输出:
2008-05-13
思路一:
#include <iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1,int sky = 0){_year = year;_month = month;_day = day;_sky = sky;}int GetMonth(int& year, int& month){int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return arr[month];}void Calendar(){_day = _day + _sky;while (_day > GetMonth(_year, _month)){_day = _day - GetMonth(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}}friend ostream& operator<<(ostream& out, Date& d);friend istream& operator>>(istream& out, Date& d);private:int _year;int _month;int _day;int _sky;
};ostream& operator<<(ostream& out, Date& d)
{printf("%04d-%02d-%02d", d._year, d._month, d._day);return out;
}
istream& operator>>(istream& in, Date& d)
{in>>d._year>>d._month>>d._day>>d._sky;return in;
}int main()
{int n = 0;cin>>n;while(n--){Date d1;cin>>d1;d1.Calendar();cout<<d1<<endl;;}return 0;
}
// 64 位输出请用 printf("%lld")
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!