前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【OJ】求和与计算日期

【OJ】求和与计算日期

作者头像
zxctscl
发布2024-03-05 09:54:31
950
发布2024-03-05 09:54:31
举报
文章被收录于专栏:zxctscl个人专栏

1. 前言

下面两个题目均来自牛客,使用的编程语言是c++,分享个人的一些思路和代码。

2. JZ64 求1+2+3+…+n

2.1 题目分析

注意看题目描述,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句。

按照之前的想法,可以用递归,循环,等差求和,但是这里都被限制了,那么该怎么办呢?

那么就走构造函数,先定义一个Sum类,其中包含两个静态变量。这两个变量并不是属于这个某个对象,而是属于整个类。 在构造函数里面走静态变量,每次加等_i,再让_i加加。

现在就存在一个问题,怎么让Sum调用n次? 那就构造n个对象就可以了,用数组来构造就行。

要拿到最后的结果,还得再写一个成员函数来返回最后得到的_ret值,因为是再整个类中,所以使用static修饰。

这样就通过了。

2.2 代码

代码语言:javascript
复制
class Sum
{
 private:
         static int _i;
         static int _ret;

 public:
       Sum()
       {
        _ret+=_i;
        _i++;
       }
       static int GetRet()
       {
        return _ret;
       }

};
int Sum::_i=1;
int Sum::_ret=0;
class Solution {
public:
    int Sum_Solution(int n) {
        Sum s[n];
        return Sum::GetRet();      
    }
};

3. HJ73 计算日期到天数转换

3.1 题目分析

题目要求根据输入的日期,计算是这一年的第几天。 我们会直接想到把每个月的天数直接相加就行,但是前提是得知道每个月有多少天,而2月份在闰年是29,所以得先判断一下是不是闰年。 就先写一个函数来判断是不是闰年,如果是就返回true,不是就返回false。

代码语言:javascript
复制
bool is_is_Leapyear(int year) {
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
        return true;
    }
    else {
        return false;
    }
}

要直接相加对应月的天数,直接写一个数组来表示每个月有多少天,让对应的下标就是对应的月。

代码语言:javascript
复制
 int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

在设计求和的时候会出现把当月的天数直接相加的,但是会存在这个月并不是刚好是最后一天,所以得事先将求和的变量直接定义成那个月所对应的天 int sum = d;

在实现相加之前可以先判断是不是闰年而且月份必须大于2月份,相加的时候才会先多加1。 再让月份减减,实现每个月对应的都相加上,最后将总和的天数sum输出就行。

3.2 代码

代码语言:javascript
复制
#include <iostream>
using namespace std;

bool is_Leapyear(int year) {
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
        return true;
    }
    else {
        return false;
    }
}

int main() {

    int y, m, d;
    int monthDays[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    cin >> y >> m >> d;// 注意 while 处理多个 case
    int sum = d;

    if (is_is_Leapyear(y)) {
        if (m > 2) {
            sum = sum + 1;
        }
    }
    while (m) {
        m--;
        sum += monthDays[m];
    }
    cout << sum << endl;
}

4. KY222 打印日期

4.1 题目分析

这里与上面的计算日期到天数转换类似,不过这里是给定天数来计算日期。 同样先写一个判断是不是闰年的函数。 这里因为要用到减,所以先定义两个数组,一个是闰年的,一个不是。

代码语言:javascript
复制
    int monthDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int monthDays_[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

我们了解到月份中最小的是2月份,最少是28天,可以作为循环的条件。 但是得注意,如果事先给的日期小于28,并不是0月,而是1月,这里就得在定义月份的时候直接先定为1,int m = 1;。 在减对应月份的日期时候得注意判断条件,必须是那个月份对应的日期,而且闰年与平年还是不一样的,所以这里是这样写的。

代码语言:javascript
复制
          if (is_Bisseextile(y))
            {
                if (d > monthDays_[m-1])
                {
                    d = d - monthDays_[m-1];
                }
                else
                    break;
            }
            else if(d > monthDays[m-1])
            {
                d = d - monthDays[m-1 ];
            }

注意题目最后的打印,它格式是有要求的

所以这里的打印得这样写:

代码语言:javascript
复制
printf("%04d-%02d-%02d\n", y, m, d);

4.2 代码

代码语言:javascript
复制
#include <iostream>
using namespace std;

bool is_Bisseextile(int year) {
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
        return true;
    }
    else {
        return false;
    }
}

int main() {
    int y, d;
    int monthDays[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int monthDays_[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    while (cin >> y >> d) {// 注意 while 处理多个 case
        int m = 1;
        
        while (d > 28)
        {
            if (is_Bisseextile(y))
            {
                if (d > monthDays_[m-1])
                {
                    d = d - monthDays_[m-1];
                }
                else
                    break;
            }
            else if(d > monthDays[m-1])
            {
                d = d - monthDays[m-1 ];
            }
            m++;

        }
        printf("%04d-%02d-%02d\n", y, m, d);

    }
}

有问题请指出,大家一起进步吧!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
  • 2. JZ64 求1+2+3+…+n
    • 2.1 题目分析
      • 2.2 代码
      • 3. HJ73 计算日期到天数转换
        • 3.1 题目分析
          • 3.2 代码
          • 4. KY222 打印日期
            • 4.1 题目分析
              • 4.2 代码
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档