编程题:
题一:计算日期到天数的转换
计算日期到天数转换_牛客题霸_牛客网 (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; }
题二:日期差值
示例1
输入:
20110412
20110422
输出:
11
思路一:
这个由于是想多使用一下C++新学习的知识点,所以比较臃肿!!!简洁的在思路二!!
需要定义:一个构造函数、对应月份天数、判断年月日是否相同、判断年月日大小、天数自增、计算天数差、赋值运算符重载‘ >> ’ ‘ << ’。
#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) { Date max = *this; Date min = d; if (*this < d) { max = d; min = *this; } 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; }
思路二:
第一步: 分别求出每一个日期与0000年0月1日距离的天数
第二步: 两个距离天数相减即可得到两个日期相差的天数
#include <iostream> using namespace std; //平年从1月到n月的天数 int mon[12] = { 0,31,59,90,120,151,181,212,243,273,304,334 }; //给出年月日,计算距离0000年0月1日的天数和 int CountDay(int y, int m, int d) { // 计算0-y年的天数 int yearDay = y * 365 + y / 4 - y / 100 + y / 400; // 计算到0-m月的天数 int monthDay = mon[m - 1]; if (m > 2 && ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)) monthDay += 1; return yearDay + monthDay + d; } int main() { int year1, month1, day1; scanf("%4d%2d%2d", &year1, &month1, &day1); int n1 = CountDay(year1, month1, day1); int year2, month2, day2; scanf("%4d%2d%2d", &year2, &month2, &day2); int n2 = CountDay(year2, month2, day2); cout << abs(n1 - n2) + 1 << endl; return 0; }
题三:打印日期
示例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
思路一:
这个由于是想多使用一下C++新学习的知识点,所以比较臃肿!!!简洁的在思路二!!
需要定义:一个构造函数、计算对应月份天数、规范天数、赋值运算符重载‘ >> ’ ‘ << ’的函数。
#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; }
思路二:
#include <iostream> using namespace std; int main() { int year; int day; int mon[13] = { 31, 28, 31, 30, 31, 30, 31, 31, 30 ,31, 30, 31 }; while (cin >> year >> day) { if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) mon[1] = 29; else mon[1] = 28; for (int i = 0; i < 12; i++) { if (day <= mon[i]) { printf("%04d-%02d-%02d\n", year, i + 1, day); break; } else { day = day - mon[i]; } } } return 0; }
题四:日期累加
示例1
输入:
1
2008 2 3 100
输出:
2008-05-13
思路一:
这个由于是想多使用一下C++新学习的知识点,所以比较臃肿!!!简洁的在思路二!!
需要定义:一个构造函数、计算对应月份天数、规范天数、赋值运算符重载‘ >> ’ ‘ << ’的函数。
#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")
思路二:
#include<iostream> using namespace std; int main() { int n; while (cin >> n) { for (int i = 0; i < n; i++) { int y, m, d, num; int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; cin >> y >> m >> d >> num; d += num; while (d > days[m - 1]) { if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) days[1] = 29; else days[1] = 28; d -= days[m - 1]; if (d == 0) d = 1; m++; if (m == 13) { y++; m = 1; } } printf("%4d-%02d-%02d\n", y, m, d); } } return 0; }
本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!
感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!