编程过程分析(hdu 4515为例)

在杭电上刷题也有4个多月了,做了有100+题目,每次做完一题都会回想一下做题的过程,顺便产生一点启发。

今天下午做了一道HDU 4515的模拟题,觉得有必要对自己从思考开始到最后AC掉的这个过程进行总结,大神们可以略过,这篇文章只是自己的一个笔记吧。


一、先看一下题目,分析。

当小Q使出浑身解数,终于赢得HR女神芳心的时候,却出现了一个意外情况,那就是白富美HR的妈妈并不同意他们交往,当听说小Q只是一个码农,特别是听说小Q曾经参加过资本主义国家发起的SM/ICPC比赛的时候,更是坚决反对!
  爱情是伟大的,但是得不到亲人祝福的爱情却备受折磨,小Q和HR相约在腾讯第二届编程马拉松大赛进行到第5天的时候(即2013年3月24日),一起“向前穿越D天,然后开启幸福新生活”。
  其勇气可谓令人赞叹,但可怜的小Q却总是备受折磨——小Q理解的”向前穿越”是朝着未来的方向,而女友HR理解的“向前穿越”却是朝着古代的方向!
  假设已知现在的日期和穿越的天数D,你能计算出小Q和女友各自到达的年代吗?
 

Input
  输入首先包含一个整数N,表示有N组测试用例;
  接下来N行是N组数据,每一行包含一个正整数D(D<=10,0000),D表示向前穿越的天数。
 

Output
  请计算并输出小Q和女友分别到达的日期,日期格式为YYYY/MM/DD,两个日期中间用一个空格隔开,每组数据占一行,具体输出格式请参见样例。
 

Sample Input

2 6 30
 

Sample Output

2013/03/30 2013/03/18 2013/04/23 2013/02/22

此题意思比较浅显,很容易明白的。给定一个日期,然后向前向后加多少天,最后输出结果。

首先我们要确立整体的框架。


二、是否有能力做

此题没有用到任何数据结构和算法的知识,应该是很容易做出来的。


三、确定整体框架


即输入:样例个数  以及 一个整数 day

输出:

printf("%04d/%02d/%02d %04d/%02d/%02d\n",p_y,p_m,p_d,b_y,b_m,b_d);

所以我们可以先把整体框架敲出来

#include 
#include 
using namespace std;

int main(){
	int day,N;

	cin>>N;
	while(N--){
       cin>>day;

       printf("%04d/%02d/%02d %04d/%02d/%02d\n",p_y,p_m,p_d,b_y,b_m,b_d);
	}
}


四、框架出来后,就可以思考过程

       这题应该分为两个部分

第一个部分是往后加时间

第二个部分是往前减时间

我们先来想第一部分:

如果输入的day很大的话,比如说1000天。那我们应该考虑要用循环,循环内部应该是每经历一次循环应该减多少天,知道最后1000天的day满足小于某一个月的天数

因此我们可以写个循环,跳出条件也可以确定了。然后可以用数组来写入12个月,因为年份又有闰年和平年之分,所以我们用二位数组来写入闰年和平年的月


int main(){
	int day,N;
    int year[12][2]={{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
    int p_y,p_m,p_d;
	int b_y,b_m,b_d;

		p_y = b_y = 2013;
		p_m = b_m = 3;
     	p_d = b_d = 24;

	cin>>N;
	while(N--){
       cin>>day;
    //向后加
	   while(天数x 大于 某一个月的天数){

}
//向前减
while(天数x 大于 某一个月的天数){

}

       printf("%04d/%02d/%02d %04d/%02d/%02d\n",p_y,p_m,p_d,b_y,b_m,b_d);
	}
}


两个主题部分框架已经写好了,再往里面思考

day比较大的时候,year也是要改变的,

那么year的改变有两种情况  1:到12月份的时候,还要往后加   2:到1月份的时候还要往后减

所以我们先写出判断闰年的函数

int is_year(int year){
	if((year%4==0&&year%100!=0)||(year%400==0)){
		return 1;
	}else{
		return 0;
	}
}


然后利用此函数再在循环体内写出一个判断

if(i == 11){
				(p_y)++;
                is_ry = is_year(p_y);
				p_m = 1;
			}else{
                p_m++;
			}

我们这里的i是从0到11的。

相应的在下面的向后减额循环中也写入相应的判断

if(i == 0){
				(b_y)--;
				is_ryy = is_year(b_y);
				b_m = 12;
			}else{
				b_m--;
			}

所以此时整体代码基本有了

int main()
{
    int N,M,day;
	int i,j;
	int is_ry,is_ryy;
    int year[12][2]={{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
    int p_y,p_m,p_d;
	int b_y,b_m,b_d;

	cin>>N;
	while(N--){
		cin>>day;
 
		p_y = b_y = 2013;
		p_m = b_m = 3;
     	p_d = b_d = 24;
//************************************
		i = p_m - 1;
		int x = day + p_d;

		while(x > year[i][is_ry]){
            if(i == 11){
				(p_y)++;
                is_ry = is_year(p_y);
				p_m = 1;
			}else{
                p_m++;
			}
			
		}

//************************************
		i = b_m - 1;
		x = b_d - day;
		while(x < 1){
            if(i == 0){
				(b_y)--;
				is_ryy = is_year(b_y);
				b_m = 12;
			}else{
				b_m--;
			}
		
		}

//*************************************
		printf("%04d/%02d/%02d %04d/%02d/%02d\n",p_y,p_m,p_d,b_y,b_m,b_d);
	}
	return 0;
}

三、分析细节,开始测试

         到这一步基本要接近尾声了,要考虑大概循环跳出的时候要执行那些语句了。以及循环开始前需要哪些初始化的语句,我就不细说了。




做的很粗糙,算是一个笔记吧。贴出整个代码

#include 
#include 
using namespace std;

int is_year(int year){
	if((year%4==0&&year%100!=0)||(year%400==0)){
		return 1;
	}else{
		return 0;
	}
}

int main()
{
    int N,M,day;
	int i,j;
	int is_ry,is_ryy;
    int year[12][2]={{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
    int p_y,p_m,p_d;
	int b_y,b_m,b_d;

	cin>>N;
	while(N--){
		cin>>day;
 
		p_y = b_y = 2013;
		p_m = b_m = 3;
     	p_d = b_d = 24;
//************************************
		i = p_m - 1;
		int x = day + p_d;
		is_ryy = is_ry = is_year(p_y);

		while(x > year[i][is_ry]){
            if(i == 11){
				(p_y)++;
                is_ry = is_year(p_y);
				p_m = 1;
			}else{
                p_m++;
			}
			x -= year[i][is_ry];  
			i = p_m - 1;
			i %= 12;			
		}
        p_d = x;
//************************************
		i = b_m - 1;
		x = b_d - day;
		while(x < 1){
            if(i == 0){
				(b_y)--;
				is_ryy = is_year(b_y);
				b_m = 12;
			}else{
				b_m--;
			}
			i = b_m - 1;
			x += year[i][is_ryy];  			
		}
        b_d = x;
//*************************************
		printf("%04d/%02d/%02d %04d/%02d/%02d\n",p_y,p_m,p_d,b_y,b_m,b_d);
	}
	return 0;
}







你可能感兴趣的:(随笔,模拟)