首页 > 编程语言 >C++:类和对象OJ题

C++:类和对象OJ题

时间:2024-09-21 21:48:13浏览次数:11  
标签:OJ 对象 天数 31 30 2000 C++ int 日期

目录

一、求1+2+3+...+n

二、计算日期到天数的转换

三、日期差值

四、打印日期


一、求1+2+3+...+n

     这里先把题目链接放在这里求1+2+3.....+n

描述:

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

      写一段代码求1+2+3+...+n很容易,但是这道题给了很多限制,我们可以创建一个类,给这个类的构造函数加一个累加的功能,要加到几,就调用几次构造函数。

class Solution {
    class sum
    {
    public:
        sum()
        {
            num+=i;
            i++;
        }
    };
    static int i;
    static int num;
public:
    int Sum_Solution(int n) {
        sum sun[n];
        return num;
    }
};
int Solution::i=1;
int Solution::num=0;

     在类中写一个累加的构造函数,创建一个含有n个元素的数组,给的n为几,就会调用几次构造函数,通过静态变量记录,这样就能得出累加的结果了。

二、计算日期到天数的转换

    题目链接计算日期到天数的转换

描述:

根据输入的日期,计算是这一年的第几天。

保证年份为4位数且日期合法

输入描述:

输入一行,每行空格分割,分别是年,月,日

输出描述:

输出是这一年的第几天

    博主在这道题的思路是通过从这一年的1月1日加到给定的日期,记录下天数。

#include <iostream>
using namespace std;
int main() {
    int year,month,day;
    int date[13]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
    cin>>year>>month>>day;
    int sum=0;
    for(int i=1;i<month;i++)
        sum+=date[i];
    if(month>2 &&((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
    sum=sum+1+day;
    else
    sum+=day;
    cout<<sum<<endl;
    return 0;
}

     创建一个模拟每月天数的数组,通过累加的天数得到该日期是这一年的哪一天,注意平闰年的判断条件以及给的日期是否需要判断平闰年。

三、日期差值

    题目链接日期差值

描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天

输入描述:

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出描述:

每组数据输出一行,即日期差值

示例1

输入:

20110412
20110422
输出:11

    这道题博主用的方法比较简单粗暴,算出两个日期的从0年0月0日到日期的天数,然后相减得出结果。

#include <iostream>
using namespace std;
int date[13]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
int getday(int y,int m,int d)
{
	int yday=y*365;
	int mday=0;
	for(int i=1;i<m;i++)
	mday+=date[i];
	if(m>2&& ((y%4 == 0 && y%100 != 0) || y%400==0))
	mday+=1;
	return yday+mday+d;
}
int main() {
    int y1,m1,d1;
	scanf("%4d%2d%2d",&y1,&m1,&d1);
	int i=getday(y1,m1,d1);
	int y2,m2,d2;
	scanf("%4d%2d%2d",&y2,&m2,&d2);
	int j=getday(y2,m2,d2);
	cout<<abs(j-i)+1<<endl;
}

     创建一个计算从0年0月0日到所给日期的天数,让两者相减就可以了,这里要注意一下,因为系统输入的年月日是黏在一起的(最开始代码一直没过就是没注意到这个),用cin就不行了,这里就可以用scanf。

四、打印日期

    题目链接打印日期

描述

给出年分m和一年中的第n天,算出第n天是几月几号。

输入描述:

输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出描述:

可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

示例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;
int monthday[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
int getmonthday(int year, int month)
{
	if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
	{
		return 29;
	}
	else
		return monthday[month];
}
int main() {
    int y,day;
    while (cin >> y >> day) {
    int d=0;
    int m=1;
    d+=day;
    while(d>getmonthday(y,m))
    {
        d-= getmonthday(y,m);
        m++;
        if(m==13)
        {
            y++;
            m=1;
        }
    }
    printf("%04d-%02d-%02d",y,m,d);
    printf("\n");
    }
}

     创建一个能够计算该月份天数的函数,和上一篇日期类的实现中的+=的运算符重载是一样的,代码比较简单看一下就明白了,打印的格式有要求,用cout不行就用的printf(有上一题的经验特别注意了一下输入输出的格式) 。


    本篇关于类和对象的几道OJ题就到这里了,感兴趣的的可以自己去写一下,每道题都给了链接,自己写了才更有感觉。

标签:OJ,对象,天数,31,30,2000,C++,int,日期
From: https://blog.csdn.net/2401_86551514/article/details/142418134

相关文章

  • C++标准库学习(刷题应用)
    参考自菜鸟教程,用于熟悉C++常用容器刷题应用C++STLSTL核心组件:容器(Containers):向量(vector)、链表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等;序列容器:存储元素的序列,允许双向遍历std::vector:动态数组,支持快速随机访问。std::deque:双端队列,支持快速插入和删除。std::l......
  • C++学习笔记
    1、编译阶段,编译器会遍历所有的预处理语句并对其进行处理,常见的预处理语句有include、if、ifdef等等。每个文件被编译成单独的目标文件(obj文件,一个翻译单元),但是它们之间没有联系,无法交互#include指定了我们想要打开的文件,预处理器打开这个文件,阅读这个文件,拷贝这个文件到当前......
  • 【C++】数组案例:考试成绩统计
    要求:一个简单的二维数组使用案例,用于统计三个学生在三门课程中的考试成绩总分。代码要点:二维数组声明和初始化:intscore[3][3]:声明一个3行3列的二维数组,用于存储三个学生的三门课程成绩。初始化列表:为数组的每个元素赋初始值。总分统计:外层循环:遍历每个学生(行)。......
  • 【C++进阶】map和set的使用
    【C++进阶】map和set的使用......
  • 【JavaWeb从入门到精通系列】 - JavaSE基础篇(1) -面向对象
    一、封装1、存在意义public对属性的设置或者修改没有任何限制隐藏该隐藏的,暴露该暴露的。封装之后设置set和get方法2、封装//1、将需要封装的属性修饰符设置为private(私有的,在外界无法访问)privateintage;//年龄//正常情况下通过创建对象可以访问属性Students......
  • 【C++二叉树】二叉树的前序遍历、中序遍历、后序遍历递归与非递归实现
    1.二叉树的前序遍历144.二叉树的前序遍历-力扣(LeetCode) 前序遍历方式:根-左子树-右子树。递归实现:要传一个子函数来实先递归,原因是原函数返回值为vector,在原函数迭代,返回值就难处理了。非递归(迭代)实现:递归实现非常简单,非递归呢?要用迭代实现,也就是循环:还是按照根-......
  • C++ -命名空间-详解
    博客主页:【夜泉_ly】本文专栏:【C++】欢迎点赞......
  • 化繁为简:中介者模式如何管理复杂对象交互
    化繁为简:中介者模式如何管理复杂对象交互中介者模式是一种行为型设计模式,定义了一个中介者对象,来封装一组对象之间的交互。中介者模式通过将对象之间的交互行为从多个对象中抽离出来,集中封装在一个中介者对象中,从而使各个对象之间的耦合松散,且可以独立地改变它们......
  • 【服务集成】最新版 | 阿里云OSS对象存储服务使用教程(包含OSS工具类优化、自定义阿里
    文章目录一、阿里云OSS对象存储服务介绍二、服务开通与使用准备1、准备工作2、开通OSS云服务(新用户免费使用三个月)3、创建存储空间bucket4、创建并保存Accesskey5、配置访问凭证AK&SK(系统环境变量)三、阿里云OSS使用步骤1、导入依赖坐标2、文件上传Demo快速入门3、阿里......
  • 【C++ 差分数组 前后缀分解】P7404家庭菜园
    本文涉及知识点C++差分数组C++前后缀分解P7404家庭菜园出自洛谷,我简述一下。已知数组a,长度为n(1<=n<=2e5),1<=a[i]<=1e9。一次操作如下:将a[i…j]全+1。问最少操作多少次,使得a成为山形数组,即存在k,a[0…k]严格递增,a[k…]严格递减。前后缀分解+差分数组(错误解法)n=a.......