Impossible=I’m possible
只要你努力了,就没什么是不可能的!
目录
- 1.[打印日期](https://www.nowcoder.com/practice/b1f7a77416194fd3abd63737cdfcf82b?tpId=69&&tqId=29669&rp=1&ru=/activity/oj&qru=/ta/hust-kaoyan/question-ranking)
- 2.[日期累加](https://www.nowcoder.com/practice/eebb2983b7bf40408a1360efb33f9e5d?tpId=40&&tqId=31013&rp=1&ru=/activity/oj&qru=/ta/kaoyan/question-ranking)
- 3.[计算日期到天数转换](https://www.nowcoder.com/practice/769d45d455fe40b385ba32f97e7bcded?tpId=37&&tqId=21296&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking)
- 4.[日期差值](https://www.nowcoder.com/practice/ccb7383c76fc48d2bbc27a2a6319631c?tpId=62&&tqId=29468&rp=1&ru=)
1.打印日期
描述
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
代码如下:
#include <iostream>
using namespace std;
int GetMonthDay(int year ,int month)
{
static int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if(month == 2)
{
if( (year % 4 ==0&& year %100 != 0) ||year %400 == 0)
{
return 29;
}
}
return a[month];
}
int main() {
int a, b;
while (cin >> a >> b)
{
int month = 1;
int day = 0;
while( b > GetMonthDay(a, month))
{
b-= GetMonthDay(a, month);
month++;
}
day = b;
printf("%d-%02d-%02d\n",a,month,day);
}
}
2.日期累加
描述
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述:
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述:
输出m行,每行按yyyy-mm-dd的个数输出。
代码如下:
#include<iostream>
using namespace std;
bool isLepYear(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
return true;
}
else
{
return false;
}
}
int GetMonthDay(int year, int month)
{
static int a[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if ((month==2)&&isLepYear(year))
{
return 29;
}
else
{
return a[month];
}
}
int main()
{
int n = 0;
int year = 0;
int month = 0;
int day = 0;
int DaySum = 0;
cin >> n;
while (n--)
{
cin >> year >> month >> day >> DaySum; //输入
day += DaySum;
while (day > GetMonthDay(year, month))
{
day -= GetMonthDay(year, month);
month++;
if (month == 13) //下一年
{
month = 1;
year += 1;
}
}
printf("%d-%.2d-%.2d\n", year, month, day);
}
return 0;
}
3.计算日期到天数转换
描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
代码如下:
#include <stdio.h>
int is_leap_year(int year)//判断闰年 多一天
{
if((year%4==0&&year%100!=0)||(year%400==0))
{
return 1;
}
return 0;
}
int main() {
int year,month,day;
int month_day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
while (scanf("%d %d %d", &year, &month,&day) != EOF)
{
int total_day=day;
if(is_leap_year(year)==1&&month>2)
{
total_day++; //此时闰年2月份多一天是29天
}
for(int i=0;i<month;i++)
{
total_day+=month_day[i];
}
printf("%d\n",total_day);
}
return 0;
}
4.日期差值
描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
代码如下:
#include <iostream>
using namespace std;
#include<string>
using namespace std;
int tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}};
bool leapyear(int year)
{
return (year%4==0&&year%100!=0)||(year%400==0);
}
int numberofyear(int year)
{
if(leapyear(year))
return 366;
else return 365;
}
int main()
{
char s1[9];
char s2[9];
while(cin>>s1>>s2)
{
int year1,year2,month1,month2,day1,day2;
int num1=0;
int num2=0;
sscanf(s1,"%4d%2d%2d",&year1,&month1,&day1);
sscanf(s2,"%4d%2d%2d",&year2,&month2,&day2);
for(int i=0;i<year1;i++)
{
num1+=numberofyear(i);
}
for(int j=0;j<month1;j++)
{
num1+=tab[leapyear(year1)][j];
}
num1+=day1;
for(int i=0;i<year2;i++)
{
num2+=numberofyear(i);
}
for(int j=0;j<month2;j++)
{
num2+=tab[leapyear(year2)][j];
}
num2+=day2;
int num=abs(num2-num1)+1;
cout<<num<<endl;
}
}