类和对象常见题目解法

题目一:求1+2+3+…+n

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

示例:
 输入:5
   返回值:15

   输入:1
   返回值:1

如果没有限制,那么就是非常简单的一道题。但是有了这些限制,那么常规的那些方法就行不通了,但是我们知道,当一个对象被创建的时候,该对象会自动调用其默认构造函数(关键),所以我们只需创建n个对象,在默认构造函数中处理求和即可。

实现思路:创建一个求和内部类sum,外部类Solution创建n个sum对象,会调用n次默认构造函数,在内部类实现求和。

代码:

class Solution {

public:

    int Sum_Solution(int n) {

        //内部类是外部类的天生友元,可以访问外部类的私有成员

        class sum{

        public:

           sum()//sum类的默认构造函数

           {

               _ret+=_i;

               _i++;

           }

        };

   sum *p=new sum[n];//创建n个sum对象

    return _ret;

    }

private:

    static int _ret;

    static int _i;

};

int Solution::_ret=0;

int Solution::_i=1;

成员变量必须设置成静态的,因为每个对象被创建时都有属于自己的普通成员变量,而静态成员变量是属于整个类的,这样才能使得这n次调用构造函数时自增的是同一个变量,每个对象访问到的静态成员变量是同一个

题目二:计算一年的第几天

题目描述:
 根据输入的日期计算是这一年的第几天。

示例:
 输入:2021 7 18
 输出:199

实现思路:创建一个数组a用来计算该月是该年的第多少天,然后取到month的前一个月的值,然后在加上该月的天数,平闰年的判断,月份是否大于2并且该年如果是闰年,天数+1即可。

#include <iostream>

using namespace std;

int main()

{

    static int n[13]={0,31,59,90,120,151,181,212,243,273,304,334,365};//二月以平年的天数算,后续是闰年+1处理

    int year,month,day;

    cin>>year>>month>>day;

    int days=n[month-1];//得到month-1的天数

    days+=day;//加上month月的天数

    if(month>2&&((year%4==0&&year%100!=0)||(year%400==0)))

    {

        //说明是闰年并且月份大于2月

        days+=1;

    }

    cout<< days;

    return 0;

}

题目三:日期差值

题目描述:
 有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定它们之间的天数为两天。

示例:
 输入:19700101
    20210718
 输出:18827

实现思路:根据所给的两个日期,分别得到两个日期的年、月、日,然后分别计算这两个日期年相差的天数、月相差的天数(需要区分平年闰年)以及日相差的天数,将它们加起来便是这两个日期的差值

代码:

#include <iostream>

using namespace std;

bool isleapyear(int year)//判断是否是闰年

{

    if((year%4==0&&year%100!=0)||(year%400==0))

    {

        return true;

    }

    else

    {

        return false;

    }

}

int main()

{

    int date1;

    int date2;

    cin>>date1>>date2;

    if(date1>date2)

    {

        int tmp=date1;

        date1=date2;

        date2=tmp;

    }//确保第一个日期比第二个日期小

    int monthdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

    int year1,month1,day1=0;

    int year2,month2,day2=0;

    //取第一个日期的年月日

    day1=date1%100;

    date1/=100;

    month1=date1%100;

    year1=date1/100;

    //取第二个日期的年月日

    day2=date2%100;

    date2/=100;

    month2=date2%100;

    year2=date2/100;

    //比较年相差的天数

    int i=0;

    int gapdays=0;

    for(i=year1;i<year2;i++)

    {

        if(isleapyear(year1))

        {

            gapdays+=366;

        }

        else

        {

            gapdays+=365;

        }

    }

    //比较月相差的天数

    for(i=month1;i<month2;i++)

    {

        gapdays+=monthdays[month1];

        if(i==2&&isleapyear(year2))

        {

            gapdays+=1;

        }

    }

    //比较天相差的天数

    for(i=day1;i<=day2;i++)

    {

        gapdays+=1;

    }

    cout<<gapdays;

    return 0;

}

题目四:打印日期

题目描述:
 给出年份m和一年中的第n天,计算出第n天是几月几号。输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

示例:
 输入:2022 300
 输出:2022-10-27

实现思路:先进行平闰年的判断,设置月份从1月开始,判断天数是否合理,若大于该年该月的天数,则将总天数减去该月的天数后作为新的总天数,然后将月份加一,继续进行判断。直至日期合理。

代码:

#include <iostream>

using namespace std;

bool IsLeapyear(int y)

{

    if((y%4==0&&y%100!=0)||(y%400==0))

    {

        return true;

    }

    else

    {

        return false;

    }

}

int main()

{

    int y,n;

    while(cin>>y>>n)

    {

    int monthdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

    int m=1;

    if(IsLeapyear(y))//如果是闰年,二月是29天

    {

        monthdays[2]=29;

    }

    while(n>monthdays[m])//判断天数是否合理

    {

        n-=monthdays[m];//减去该月的天数

        m++;//往下一个月继续判断

    }

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

    }

}

题目五:日期累加
题目描述:
 设计一共程序能计算一个日期加上若干天后是什么日期。

输入描述:
 输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。

输出描述:
 输出m行每行按yyyy-mm-dd的格式输出。

示例:
 输入:1
    2022 10 27 100
 输出:2023-02-04

实现思路:先实现一个得到该年该月的天数的方法,输入的天数加上需加的天数,判断日期是否合理,若该天数大于该年该月的天数,该天数减去该年该月的天数,month++,若该年已满,年++,month设置为1,继续判读,直至日期合理。

代码:

#include <iostream>

using namespace std;

//实现得到该年该月的天数

int GetMonthDays(int y,int m)

{

    static int monthdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

    int d=monthdays[m];

    if(m==2&&(y%4==0&&y%100!=0)||(y%400==0))

    {

        d++;

    }

    return d;

}

int main()

{

    int m;

    cin>>m;

    int year,month,day;

    int sumd;//需要加的天数

    for(int i=0;i<m;i++)

    {

    cin>>year>>month>>day>>sumd;

    day+=sumd;

    while(day>GetMonthDays(year, month))//判断日期是否合理

    {

        day-=GetMonthDays(year, month);

        month++;

        if(month>12)

        {

            month=1;

            year++;

        }

    }

    printf("%02d-%02d-%02d\n",year,month,day);

    }

}

    

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值