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;
参考代码:
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。这里减去一年的天数时要判断当年是否是闰年,减去一月时要判断当月有几天。
参考代码:
描述
一种细菌的繁殖速度是每天成倍增长。例如:第一天有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 =