code up 打印日期

本文介绍了一种算法,用于根据给定的年份和一年中的第n天计算出该天的具体日期。通过区分闰年和平年,使用数组记录每月累计天数,实现了快速定位月份和计算具体日期的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给出年分m和一年中的第n天,算出第n天是几月几号。

输入

输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出

可能有多组测试数据,对于每组数据,按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

样例输入

2013 60
2012 300
2011 350
2000 211

样例输出

2013-03-01
2012-10-26
2011-12-16
2000-07-29

个人思路:首先这个问题是吧年份中的天数转换为当年对应的日期,首先想到区分闰年和平年,分别作出处理(其实大同小异暂未想到统一处理方法),然后再划分月份,划分月份时本打算计算月份的天数区间划分月份(人工计算),感觉太麻烦写得好多if esle,后来用数组尝试,数组保留前n(0 -- 12)个月份的天数 ,遍历计算找到天数和月份的规律,发现不小于当前年份天数n的第一个数组的下标即为当前月份,然后再计算本月天数(即当前年份天数n - 前几个月的天数)。

最后是输出格式的处理题目要求yyyy-mm-dd 年月日不足位数用0在前边补齐即

    cout << setw(4) << setfill('0') << y << "-"; //(头文件为 #include<iomanip>)

下面是实现代码:

#include <iostream>
#include <cstdio>
#include <iomanip>
using namespace std;

int noLeap[13] = {0, 31, 59, 90,120,151,181,212,243,273,304,334,365};
int leapDay[13] = {0, 31, 60, 91,121,152,182,213,244,274,305,335,366};

int main()
{
	int y, n;
	while(scanf("%d%d",&y,&n) != EOF)
	{
		int m, d;
		//闰年 
		if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
		{
			for(int i = 0; i < 13; i++)
			{
				if(leapDay[i] >= n)
				{
					m = i;	//利用数组下标和月份差一 
					d = n - leapDay[i - 1];
					break;
				}
				
			}
		} 
		//平年 
		else
		{
			for(int j = 0; j < 13; j++)
			{
				if(noLeap[j] >= n)
				{
					m = j;
					d = n - noLeap[j - 1];
					break;
				}
				
			}
		} 
		cout << setw(4) << setfill('0') << y << "-"; //4位数字不够前边0补齐 
		cout << setw(2) << setfill('0') << m << "-";
		cout << setw(2) << setfill('0') << d << endl;
		
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值