时间与日期处理模块 题目解题报告

01:细菌繁殖
描述
一种细菌的繁殖速度是每天成倍增长。例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,……。现在给出第一天的日期和细菌数目,要你写程序求出到某一天的时候,细菌的数目。
输入
第一行有一个整数n,表示测试数据的数目。其后n行每行有5个整数,整数之间用一个空格隔开。第一个数表示第一天的月份,第二个数表示第一天的日期,第三个数表示第一天细菌的数目,第四个数表示要求的那一天的月份,第五个数表示要求的那一天的日期。已知第一天和要求的一天在同一年并且该年不是闰年,要求的一天一定在第一天之后。数据保证要求的一天的细菌数目在长整数(long)范围内。
输出
对于每一组测试数据,输出一行,该行包含一个整数,为要求的一天的细菌数。
样例输入
2
1 1 1 1 2
2 28 10 3 2
样例输出
2
40


解题思路
这题实际上是求给定的两天之间间隔的天数n,第一天的细菌数乘以2的n次方就是题目的答案。每个月的天数因为不很规则,如果在程序中用规则描述会比较麻烦,所以可以使用一个数组将每个月的天数存起来。整个计算过程可以描述如下:
读入测试样例数n;
做n次:1. 读入两个日期及第一天的细菌数;
2. 将两个日期转换为当年的第几天;
3.得到两个天数的差,即它们中间间隔的天数m;
4.用第一天的细菌数乘以2的m次方等到x;
5. 输出x;
参考代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;

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

int main()
{
	
	int n, t = 0,m1,d1,num,m2,d2;
	long long sum;
	scanf("%d",&n);
	while( n != 0)
	{
		t = 0;
		scanf("%d%d%d%d%d", &m1,&d1,&num,&m2,&d2);
		sum = num;
		for(int i = m1; i < m2; i++)
		{
			t += mon[i];
		}
		t = t - d1;
		t = t + d2;
		//printf("%d\n", t);
	    for(int i = 1; i <= t; i++)
	      sum *= 2;
	    printf("%ld\n", sum);
	    n--;
	}
	
	return 0;
}




02:日历问题
描述
在我们现在使用的日历中, 闰年被定义为能被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
提示
2000.1.1. 是星期六

解题思路
这道题目使用的背景知识是闰年的定义和公历日历中一年12个月中每个月的日期数。
根据题目要求,所有涉及的数值都是用整数可以表示的。这个问题可以分解成两个彼此独立的问题:一个是要求的那天是星期几,另一是要求的那天是哪年哪月那天。第一个问题比较简单,知道2000年1月1日是星期几后,只要用给定的日期对7取模,就可以知道要求的一天是星期几。第二个问题相对麻烦一些。我们用year, month, date分别表示要求的日期的年、月、日。当输入一个整数n时,如果n大于等于一年的天数,就用n减去一年的天数,直到n比一年的天数少(这时假设剩下天数为m),一共减去多少年year就等于多少;如果m大于等于一个月的天数,就用m减去一个月的天数,直到m比一个月的天数少(这时假设剩下的天数为k),一共减去多少个月month就等于多少;这时k为从当月开始逝去的天数,k+1就是要求的date。这里减去一年的天数时要判断当年是否是闰年,减去一月时要判断当月有几天。

参考代码:


#include <stdio.h>
int type(int );
char week[7][10]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
int year[2]={365,366}; //year[0]表示非闰年的天数,year[1]表示闰年的天数。
int month[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31};
//month[0]表示非闰年里每个月的天数,month[1]表示闰年里每个月的天数。
int  main()
{  
	int days, dayofweek; //days 表示输入的天数,dayofweek表示星期几。
	int i = 0, j = 0;
	while (scanf("%d", &days) && days != -1) {
        dayofweek = days % 7;
	    for(i =
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
POJ1915是一道经典的搜索题目,也被称为“Knight Moves”。下面我将为您提供解题思路和解题步骤: 1. 题目描述 在8x8的国际象棋棋盘上,棋子“马”从初始位置出发,允许走字形的移动。给定目标位置,求出从初始位置到目标位置最少需要几步。 2. 解题思路 这道题目可以采用广度优先搜索(BFS)算法解决。将初始位置加入队列中,然后依次处理队列中的每个位置,根据“马”的走法,生成下一步可以到达的位置,如果这个位置没有被访问过,则将其加入队列中,并记录到达这个位置的步数。 3. 解题步骤 具体的解题步骤如下: (1)将初始位置加入队列中,并记录步数为0。 (2)依次处理队列中的每个位置,生成下一步可以到达的位置。 (3)如果下一步可以到达的位置没有被访问过,则将其加入队列中,并记录到达这个位置的步数为当前位置的步数+1。 (4)重复步骤(2)和(3),直到队列为空。 (5)如果目标位置被访问过,则返回到达目标位置的步数,否则返回-1。 4. 注意事项 在实现BFS算法的过程中,需要注意以下几点: (1)需要记录每个位置是否被访问过,以避免重复访问。 (2)需要注意边界条件,防止数组越界。 (3)需要注意判断目标位置是否合法,即是否在棋盘范围内。 5. 总结 本题是一道经典的搜索题目,采用BFS算法可以求解出从初始位置到目标位置最少需要几步。在解题过程中,需要注意边界条件和目标位置是否合法等问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值