王道机试C++第一章:暴力求解-模拟篇 日期问题 Day25

2、日期问题

日期类运算的各种问题同样被频繁地选入机试考题中,但这类问题通常都有规律可循。只
要能够把握这类问题题面中的核心规律,求解这类问题就不会有太大的难度
关键:1、数组;2、循环;---->熟练调试代码
1)year 是否是闰年:year%400==0 || year%100!=0 && year%4==0 (eg:2014,注意&&的优先级高于|| )
2)月中有多少天:辅助数组把月份提前输入 eg:mday [13]={......} 空间换时间

今年的第几天?(清华复试上机)

题目描述:
输入年、月、日,计算该天是本年的第几天。
输入: 包括 3 个整数:年( 1<= Y <=  3000 )、月( 1 <=   M <=  12 )、日( 1 <=   D <=   31 )。
输出: 输入可能有多组测试数据,对于每组测试数据,
输出一个整数,代表 Input 中的年、月、日对应本年的第几天。
样例输入: 1990 9 20
                   2000 5 1
样例输出: 263 
                   122
代码表示:
#include <iostream>
using namespace std;

int main() {
	int year,mon,day;
    int mday[13]={0,31,28,31,30,31,31,30,31,30,31};
	int totalDay[13]={0};
	for(int mon=2;mon<=12;++mon){
	//到mon月1日的天数=到mon-1月1日的天数+第mon-1月的天数 
		totalDay[mon]=totalDay[mon-1]+mday[mon-1];	
	}
	while(scanf("%d%d%d",&year,&mon,&day)!=EOF){
		//如果是闰年
		bool isleap=year%400==0||year%100!=0&&year%4==0;
		if(isleap==true && mon>=3){//对超过2月的有影响
		printf("%d\n",totalDay[mon]+day+1); 
		}
		else{
			printf("%d\n",totalDay[mon]+day);
		}
	}
  }

打印日期(华中科技大学复试上机题)

题目描述:
给出年份 m 和一年中的第 n 天,算出第 n 天是几月几号。
输入: 输入包括两个整数:y 1 <=   y <=  3000 )和 n 1 <=  n <=  366 )。
输出: 可能有多组测试数据,对于每组数据,
按格式 yyyy-mm-dd 将输入中对应的日期打印出来。
样例输入:
2000 3
2000 31
2000 40
2000 60
2000 61
2001 60
样例输出:
2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01
注意:
代码表示
#include <iostream>
using namespace std;

int main(){
	int year,n;
	int mday[13]={0,31,28,31,30,31,31,30,31,30,31};
	while(scanf("%d%d",&year,&n)!=EOF){
	    int mon=1;
		int day=1;
		for(int i=0;i<n;++i){
			bool isleap=year%400==0||year%100!=0&&year%4==0;
			if(isleap){
				mday[2]=29;
			}
			else{
				mday[2]=28;
			}
			//下一天
			++day;
			if(day>mday[mon]){//到了32号了 
				++mon;
				day=1;
				if(mon>12){//到了13月 
					mon=1;
					++year;
				}
			} 
		}
		printf("%4d-%02d-%02d\n",year,mon,day);	
	}
}

日期累加(北京理工大学复试上机题)

题目描述:
设计一个程序,它能够计算一个日期加上若干天后是什么日期。
输入: 输入第一行表示样例个数 m ,接下来的 m 行中,每行 4 个整数,分别表示年、月、日和累加的天数。
输出: 输出 m 行,每行按 yyyy-mm-dd 的个数输出。
样例输入:
1
2008 2 3 100
样例输出:
2008-05-13
代码表示:
#include <iostream>
#include <cstdio>
using namespace std;

int daytab[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 IsLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

int NumberOfYear(int year) { //返回该年天数
    if (IsLeapYear(year)) {
        return 366;
    } else {
        return 365;
    }
}

int main() {
    int year, month, day;
    int number; //记录天数
    int caseNumber; //组数
    scanf("%d", &caseNumber); // 输入组数
    while (caseNumber--) {
        scanf("%d%d%d%d", &year, &month, &day, &number); // 输入年、月、日和天数
        int row = IsLeapYear(year);
        for (int j = 0; j < month; ++j) {
            number += daytab[row][j]; // 计算给定日期在一年中的天数
        }
        number += day;
        while (number > NumberOfYear(year)) { //确定年
            number -= NumberOfYear(year);
            year++;
        }
        month = 1; // 修正月份从1开始
        row = IsLeapYear(year);
        while (number > daytab[row][month]) { //确定月
            number -= daytab[row][month];
            month++;
        }
        day = number; //确定日
        printf("%04d-%02d-%02d\n", year, month, day); // 输出日期
    }
    return 0;
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值