题目一:求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);
}
}