C++:OJ练习(每日练习!)

简介: C++:OJ练习(每日练习!)

编程题:

题一:计算日期到天数的转换

计算日期到天数转换_牛客题霸_牛客网 (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

思路一:

这个由于是想多使用一下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;
}

题三:打印日期

打印日期_牛客题霸_牛客网 (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

思路一:

这个由于是想多使用一下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;
}

题四:日期累加

日期累加_牛客题霸_牛客网 (nowcoder.com)

示例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;
}

本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!

                                             

目录
相关文章
|
1月前
|
C++
C++:OJ练习(每日练习系列)
C++:OJ练习(每日练习系列)
34 2
|
4月前
|
存储 C++ 容器
【C++&数据结构】二叉树(结合C++)的经典oj例题 [ 盘点&全面解析 ](24)
【C++&数据结构】二叉树(结合C++)的经典oj例题 [ 盘点&全面解析 ](24)
|
3月前
|
C++
c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)
c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)
54 0
|
1月前
|
Shell C++
C++:OJ练习(每日练习系列)
C++:OJ练习(每日练习系列)
26 1
|
3月前
|
C++ 索引
c++:string相关的oj题(415. 字符串相加、125. 验证回文串、541. 反转字符串 II、557. 反转字符串中的单词 III)
c++:string相关的oj题(415. 字符串相加、125. 验证回文串、541. 反转字符串 II、557. 反转字符串中的单词 III)
42 0
|
2月前
|
Java C++ Python
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
29 0
|
2月前
|
Java C++ Python
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-161 Abbott’s Revenge(C++写法)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-161 Abbott’s Revenge(C++写法)
125 42
|
3月前
|
Linux C++ iOS开发
C++类相关oj题目分享(计算日期到天数转换、日期差值、打印日期、日期累加)
C++类相关oj题目分享(计算日期到天数转换、日期差值、打印日期、日期累加)
44 0
|
3月前
|
存储 C++ 容器
『 C++ 』二叉树进阶OJ题(下)
『 C++ 』二叉树进阶OJ题(下)
|
3月前
|
C++ 容器
『 C++ 』二叉树进阶OJ题(中)
『 C++ 』二叉树进阶OJ题(中)