算法笔记007——日期问题合辑
作者:互联网
问题 A: 判断闰年
时间限制: 1 Sec 内存限制: 128 MB
提交: 17 解决: 9
[提交][状态][讨论版][命题人:1010101010]
题目描述
判断某年是否是闰年。 输入
输入只有一行,包含一个整数a(0 < a < 3000) 输出
一行,如果公元a年是闰年输出Y,否则输出N 样例输入
2006
样例输出
N
#include <cstdio>
int main()
{
int year;
scanf("%d",&year);
if((year%4 == 0 && year%100 != 0)||year%400 == 0)
printf("Y");
else
printf("N");
return 0;
} 问题 B: 细菌繁殖
时间限制: 1 Sec 内存限制: 128 MB
提交: 0 解决: 0
[提交][状态][讨论版][命题人:1010101010]
题目描述
一种细菌的繁殖速度是每天成倍增长。例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,……。现在给出第一天的日期和细菌数目,要你写程序求出到某一天的时候,细菌的数目。 输入
第一行有一个整数n,表示测试数据的数目。其后n行每行有5个整数,整数之间用一个空格隔开。第一个数表示第一天的月份,第二个数表示第一天的日期,第三个数表示第一天细菌的数目,第四个数表示要求的那一天的月份,第五个数表示要求的那一天的日期。已知第一天和要求的一天在同一年并且该年不是闰年,要求的一天一定在第一天之后。数据保证要求的一天的细菌数目在长整数(long)范围内。 输出
对于每一组测试数据,输出一行,该行包含一个整数,为要求的一天的细菌数。 样例输入
2
1 1 1 1 2
2 28 10 3 2
样例输出
2
40
#include <cstdio>
int date[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{ int n, fm, fd, t, bm, bd;
scanf("%d",&n);
while(n--)
{
int sum_date = 0;
scanf("%d%d%d%d%d", &fm, &fd, &t, &bm, &bd);
sum_date = bd - fd;
while(fm != bm)
{
sum_date += date[fm];
fm++;
}
for(int i = 0; i < sum_date; i++)
{
t *= 2;
}
printf("%d\n",t);
}
return 0;
}
问题 C: 不吉利日期
时间限制: 1 Sec 内存限制: 128 MB
提交: 0 解决: 0
[提交][状态][讨论版][命题人:1010101010]
题目描述
在国外,每月的13号和每周的星期5都是不吉利的。特别是当13号那天恰好是星期5时,更不吉利。已知某年的一月一日是星期w,并且这一年一定不是闰年,求出这一年所有13号那天是星期5的月份,按从小到大的顺序输出月份数字。(w=1..7) 输入
输入有一行,即一月一日星期几(w)。(1<=w<=7) 输出
输出有一到多行,每行一个月份,表示该月的13日是星期五。 样例输入
7
样例输出
1
10
#include <cstdio>
int main()
{
int day[8] = {0,6,7,1,2,3,4,5};
int date[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int n;
scanf("%d",&n);
for(int i = 1; i <= 12; i++)
{
if(day[n] == 5)
printf("%d\n",i);
n = (n + date[i])%7;
if(n == 0)
n = 7;
}
return 0;
} 问题 K: 日历问题
时间限制: 1 Sec 内存限制: 128 MB
提交: 37 解决: 12
[提交][状态][讨论版][命题人:1010101010]
题目描述
在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而1600, 2000 和 2400是闰年。 给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。
输入
输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是−1, 不必处理。可以假设结果的年份不会超过9999。
输出
对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个: "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" 或 "Saturday“。
样例输入
1730
1740
1750
1751
-1
样例输出
2004-09-26 Sunday
2004-10-06 Wednesday
2004-10-16 Saturday
2004-10-17 Sunday #include <cstdio> int year, month, day, t;
char week[7][10] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; bool IsEndofMonth()//返回值为1或者0;
{
switch(month)
{
case 4:
case 6:
case 9:
case 11:
return day == 30;
case 2:
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return day == 29;
else
return day == 28;
default:
return day == 31;
}
} void AddDay(int days)
{
for (int i = 0; i < days; i++)
{
if(IsEndofMonth())
{
if(month == 12)
{
day = 1;
month = 1;
year++;
}
else
{
day = 1;
month++;
}
}
else
{
day++;
}
}
} int main()
{
int n;
while (~scanf("%d",&n))
{
if(n == -1)
break;
year = 2000;
month = 1;
day = 1;
t = 6;
AddDay(n);
t = (t + n)%7;
printf("%d-%02d-%02d %s\n", year, month, day, week[t]);
}
return 0;
}
时间限制: 1 Sec 内存限制: 128 MB
提交: 17 解决: 9
[提交][状态][讨论版][命题人:1010101010]
题目描述
判断某年是否是闰年。 输入
输入只有一行,包含一个整数a(0 < a < 3000) 输出
一行,如果公元a年是闰年输出Y,否则输出N 样例输入
2006
样例输出
N
#include <cstdio>
int main()
{
int year;
scanf("%d",&year);
if((year%4 == 0 && year%100 != 0)||year%400 == 0)
printf("Y");
else
printf("N");
return 0;
} 问题 B: 细菌繁殖
时间限制: 1 Sec 内存限制: 128 MB
提交: 0 解决: 0
[提交][状态][讨论版][命题人:1010101010]
题目描述
一种细菌的繁殖速度是每天成倍增长。例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,……。现在给出第一天的日期和细菌数目,要你写程序求出到某一天的时候,细菌的数目。 输入
第一行有一个整数n,表示测试数据的数目。其后n行每行有5个整数,整数之间用一个空格隔开。第一个数表示第一天的月份,第二个数表示第一天的日期,第三个数表示第一天细菌的数目,第四个数表示要求的那一天的月份,第五个数表示要求的那一天的日期。已知第一天和要求的一天在同一年并且该年不是闰年,要求的一天一定在第一天之后。数据保证要求的一天的细菌数目在长整数(long)范围内。 输出
对于每一组测试数据,输出一行,该行包含一个整数,为要求的一天的细菌数。 样例输入
2
1 1 1 1 2
2 28 10 3 2
样例输出
2
40
#include <cstdio>
int date[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{ int n, fm, fd, t, bm, bd;
scanf("%d",&n);
while(n--)
{
int sum_date = 0;
scanf("%d%d%d%d%d", &fm, &fd, &t, &bm, &bd);
sum_date = bd - fd;
while(fm != bm)
{
sum_date += date[fm];
fm++;
}
for(int i = 0; i < sum_date; i++)
{
t *= 2;
}
printf("%d\n",t);
}
return 0;
}
问题 C: 不吉利日期
时间限制: 1 Sec 内存限制: 128 MB
提交: 0 解决: 0
[提交][状态][讨论版][命题人:1010101010]
题目描述
在国外,每月的13号和每周的星期5都是不吉利的。特别是当13号那天恰好是星期5时,更不吉利。已知某年的一月一日是星期w,并且这一年一定不是闰年,求出这一年所有13号那天是星期5的月份,按从小到大的顺序输出月份数字。(w=1..7) 输入
输入有一行,即一月一日星期几(w)。(1<=w<=7) 输出
输出有一到多行,每行一个月份,表示该月的13日是星期五。 样例输入
7
样例输出
1
10
#include <cstdio>
int main()
{
int day[8] = {0,6,7,1,2,3,4,5};
int date[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int n;
scanf("%d",&n);
for(int i = 1; i <= 12; i++)
{
if(day[n] == 5)
printf("%d\n",i);
n = (n + date[i])%7;
if(n == 0)
n = 7;
}
return 0;
} 问题 K: 日历问题
时间限制: 1 Sec 内存限制: 128 MB
提交: 37 解决: 12
[提交][状态][讨论版][命题人:1010101010]
题目描述
在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而1600, 2000 和 2400是闰年。 给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。
输入
输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是−1, 不必处理。可以假设结果的年份不会超过9999。
输出
对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个: "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" 或 "Saturday“。
样例输入
1730
1740
1750
1751
-1
样例输出
2004-09-26 Sunday
2004-10-06 Wednesday
2004-10-16 Saturday
2004-10-17 Sunday #include <cstdio> int year, month, day, t;
char week[7][10] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; bool IsEndofMonth()//返回值为1或者0;
{
switch(month)
{
case 4:
case 6:
case 9:
case 11:
return day == 30;
case 2:
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return day == 29;
else
return day == 28;
default:
return day == 31;
}
} void AddDay(int days)
{
for (int i = 0; i < days; i++)
{
if(IsEndofMonth())
{
if(month == 12)
{
day = 1;
month = 1;
year++;
}
else
{
day = 1;
month++;
}
}
else
{
day++;
}
}
} int main()
{
int n;
while (~scanf("%d",&n))
{
if(n == -1)
break;
year = 2000;
month = 1;
day = 1;
t = 6;
AddDay(n);
t = (t + n)%7;
printf("%d-%02d-%02d %s\n", year, month, day, week[t]);
}
return 0;
}
标签:30,int,31,合辑,样例,算法,007,year,day 来源: https://www.cnblogs.com/jun-ruo-sui-nian/p/suijun_007.html