首页 > 试题广场 >

打印日期

[编程题]打印日期
  • 热度指数:42339 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
给出年分m和一年中的第n天,算出第n天是几月几号。

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


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

输入

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<stdio.h>//1.判断闰年2.找月数,累减n
int main()
{
    int y,n,month,day,run,i;
    int a[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}};
    scanf("%d%d",&y,&n);
    if(y%4==0&&y%100!=0||y%400==0) run=1;//判断闰年
    else run=0;
    for(i=1;i<=12;i++)
    {
        if(n>a[run][i])//天数大于整月
            n-=a[run][i];//减去满月的天数
        else{//不大于这个月的天数
            month=i;day=n;break;}
    }
    printf("%d-%02d-%02d",y,month,day);//格式控制两位有效数字不够的话前补0
}

发表于 2020-03-30 17:15:47 回复(0)
建立一个数组,数组下标对应日期之差,先找到开始年份的1月1日,然后数组下标加和取得对应年月日
#include<stdio.h>
(737)#define ISLEAPYEAR(x) x%4==0 && x%100!=0 || x%400==0 ? 1 : 0
#define ABS(x) x>0 ? x : -x
int daysOfMonth[13][2] = {
    0,0,
    31,31,
    28,29,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31,
    31,31,
    30,30,
    31,31,
    30,30,
    31,31
};
struct Date {
    int year;
    int month;
    int day;
    void nextDay() {
        day++;
        if (day > daysOfMonth[month][ISLEAPYEAR(year)]) {
            day = 1;
            month++;
            if (month > 12) {
                month = 1;
                year++;
            }
        }
    }
};
Date dateCalc[2000000];
int main() {
    Date temp;
    temp.year = 0;
    temp.month = 1;
    temp.day = 1;
    int cnt = 0;
    while (cnt < 2000000) {
        temp.nextDay();
        dateCalc[cnt].year = temp.year;
		dateCalc[cnt].month = temp.month;
		dateCalc[cnt].day = temp.day;
		cnt++;
    }
    int year, month=1, day=1, i_year, i_days, count=0;
    while (scanf("%d%d", &i_year, &i_days) != EOF) {
        int ctrl = 0;
		count = i_year * 365;
        while (dateCalc[count++].year != i_year);
        year = dateCalc[count + i_days - 2].year;
        month = dateCalc[count + i_days - 2].month;
        day = dateCalc[count + i_days - 2].day;
        printf("%04d-%02d-%02d", year, month, day);
    }
    return 0;
}
发表于 2020-03-20 02:07:55 回复(0)
Java8新的时间API确实好用
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int year = scanner.nextInt();
            int days = scanner.nextInt();
            LocalDate day = LocalDate.ofYearDay(year, days);
            DecimalFormat f = new DecimalFormat("00");
            System.out.println(day.getYear()+"-"+f.format(day.getMonth().getValue())+"-"+f.format(day.getDayOfMonth()));
        }
    }
}


发表于 2020-03-18 10:53:50 回复(0)

Once AC
#include <bits/stdc++.h>
using namespace std;
bool isrunnian(int y) {
	return (y%4==0&&y%100!=0)||(y%400==0);
}
int main() {
	int y,m,d,n;
	int date[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}
	};
	while(cin>>y>>n) {
		m=1;
	//	d=0;
		for(int i=1; i<=12; i++) {
			if(n-date[isrunnian(y)][i]<=0) {
				printf("%d-%02d-%02d\n",y,m,n);
				break;
			} else {
				m++;
				n-=date[isrunnian(y)][i];
			}

		}
	}

	return 0;
}


发表于 2020-03-14 20:24:06 回复(0)
#include <iostream>
#include <iomanip>
using namespace std;

bool is_rui(int year){
    return year%400==0||((year%100!=0&&year%4==0));
}

int main(){
    int rui[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int pin[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int year,month=0,day;
    while(cin>>year>>day){
        if(is_rui(year)){
            while(day-rui[month]>0){
                day-=rui[month];
                ++month;
            }
            cout<<year<<'-'<<setw(2)<<setfill('0')<<++month<<'-'<<setw(2)<<setfill('0')<<day<<endl;
        }else{
            while(day-pin[month]>0){
                day-=pin[month];
                ++month;
            }
            cout<<year<<'-'<<setw(2)<<setfill('0')<<++month<<'-'<<setw(2)<<setfill('0')<<day<<endl;
        }
    }
    return 0;
}

编辑于 2020-03-11 19:06:23 回复(0)
#include<stdio.h>

int month[13][2] = {
{0,0},{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 isLeap(int year){
	return (year % 4 == 0 && year%100 != 0)||(year%400 == 0);
}

int main(){
	int year,n;
	while(scanf("%d %d",&year,&n)!=EOF){
		int i;
		for (i=0; i<13; i++ ){
			if(n > month[i][isLeap(year)])
				n -= month[i][isLeap(year)];
			else break;
		}
		printf("%04d-%02d-%02d\n",year,i,n);
	}
}

发表于 2020-03-09 18:21:47 回复(0)
tips:1.注意闰年判断,1900%400,不是闰年
         2.1个循环解决,注意判断条件
         3.注意日期格式输出,用c语言的("%02d",x)很方便
         4.注意多组输入
#include<iostream>
#include<cstring>
using namespace std;
int main() {
	int y, n;
	while (cin >> y >> n) {
		int sum = 0, date = 0, m = 0;
		int mon[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
		if (y % 100 == 0 && y % 400 == 0 || y % 100 != 0 && y % 4 == 0)
			mon[1] = 29;
		for (int i = 0; i < 12; i++) {
			sum += mon[i];
			if (sum >= n) {
				m = i + 1;
				sum -= mon[i];
				date = n - sum;
				break;
			}
		}
		printf("%04d-%02d-%02d\n", y, m, date);
	}
}

发表于 2020-02-16 12:18:18 回复(0)
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    int year, day;
    while (cin >> year >> day)
    {
        int d[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) 
            d[2]++;
        int month = 1;
        while ((day - d[month]) > 0)
        {
            day -= d[month++];
        }
        printf("%d-%02d-%02d\n", year, month, day);
    }
}

发表于 2020-02-07 18:32:30 回复(1)
#include<bits/stdc++.h>
#define isyear(x) ((x)%100!=0&&(x)%4==0||(x)%400==0)
int month[13][2]={0,0,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 main(){
    int y,d,i;
    while(scanf("%d %d",&y,&d)!=EOF){
        for(i=0;i<13;i++)
            if(d<month[i][isyear(y)]) break;
            else d-=month[i][isyear(y)];
        printf("%d-%02d-%02d\n",y,i,d);
    }
}
发表于 2019-03-28 17:49:42 回复(0)
package com.speical.first;

import java.util.Scanner;

/**
 * 给定年份和天数
 * 
 * 给出是当年那月那日
 * 
 * 注意闰年,提前累加好天数简单点
 * 放假了,学校暖气不给力了啊,手好冷,md
 * @author Special
 * @time 2018/02/10 17:46:57
 */
public class Pro219 {

    static int[] months = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};

    public static boolean isLoopYear(int year) {
        return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        while(input.hasNext()) {
            int year = input.nextInt();
            int days = input.nextInt();
            boolean isLoop = isLoopYear(year);
            int month = 1;
            for(month = 1; month < 13; month++) {
                if(days <= months[month] + (isLoop && month >= 2 ? 1 : 0)) {
                    break;
                }
            }
            int day = days - (months[month - 1] + (isLoop && month - 1 >= 2 ? 1 : 0));
            System.out.println(year + "-" + (month >= 10 ? "" : "0") + month + "-"
                                          + (day >= 10 ? "" : "0") + day);
        }
    }

}
发表于 2018-02-10 18:13:16 回复(0)
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cld = Calendar.getInstance();
		while (in.hasNext()) {
			cld.set(in.nextInt(), 0, in.nextInt());
			System.out.println(sdf.format(cld.getTime()));
		}
	}
} 
发表于 2017-05-20 01:37:38 回复(0)
#!/usr/bin/env python
#encoding:utf-8

import sys

class test(object):
	def __init__(self,year,days):
		self.dict = [31,28,31,30,31,30,31,31,30,31,30,31]
		self.year = year
		self.days = int(days)
		self.month = 0
		self.day = 0
	def j_run(self):
		if (self.year %400 ==0) or (self.year %4 ==0 and self.year %100 !=0):
			# print 'leap year'
			return 1  #leap year 
		return 0 # nonleap year
	def start(self):
		if self.j_run():
			self.dict[1] = 29 # Leap year has 29 days in February
		# print self.dict
		for a in range(12):
			self.month = 0
			self.day = 0
			if self.days > self.dict[a]:
				self.days-=self.dict[a]
			else:
				self.month,self.day = a+1,self.days
				break
		r  ='%04d-%02d-%02d' % (self.year,self.month,self.day)
		return r
for line in sys.stdin:
	nums=line.strip().split(' ')
	yy=int(nums[0])
	n=int(nums[1])
	a = test(yy,n)
	print a.start()


发表于 2017-05-13 17:28:10 回复(1)

用数组记录每个月份下累计日数的边界值

搜索判断当前日数位于哪个区间

搜索初始位置设置为 day/30 , 这样大部分情况下只需要一次判断就能得出答案

#include <stdio.h>

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


int main(void)
{
    int months_day_max[13] = {0,31,59,90,120,151,181,212,243,273,304,334,365};
    //int months_day_max[13] = {0,31,60,91,121,152,182,213,244,274,305,335,366};
    int year;
    int day;
    int month;
    int leap;
    ////////////////////////////////////////////////////////////////////////
    while(scanf("%d %d", &year, &day) != EOF)
    {
        if(day <= 31)
        {
            month = 1;
        }
        else
        {
            leap = isLeapYear(year);
            if(leap)
                months_day_max[1] = 30;
            else
                months_day_max[1] = 31;

            int f = day / 30;
            while(1)
            {
                int front =  months_day_max[f - 1] + leap;
                int current = months_day_max[f] + leap;
                int back = months_day_max[f + 1] + leap;

                if(day <= front)
                {
                    f--;
                }
                else if(day > front && day <= current)
                {
                    month = f;
                    day = day % front;
                    break;
                }
                else if(day > current && day <= back){
                    month = f + 1;
                    day = day % current;
                    break;
                }
                else
                {
                    f++;
                }
            }
        }
        printf("%04d-%02d-%02d\n", year, month, day);
    }
    return 0;
}
编辑于 2017-04-20 13:32:24 回复(0)
<?php

$a = [0,31,28,31,30,31,30,31,31,30,31,30,31];//非润年
$b = [0,31,29,31,30,31,30,31,31,30,31,30,31];//闰年

while(fscanf(STDIN,"%d %d",$year,$day)){
    $month = 0;
    if($year%4==0&&$year%100!=0||$year%400==0){
        while($day>$b[$month]){
            $day -= $b[$month];
            $month++;
        }
        printf("%04d-%02d-%02d\n",$year,$month,$day);
    }else{
        while($day>$a[$month]){
            $day -= $a[$month];
            $month++;
        }
        printf("%04d-%02d-%02d\n",$year,$month,$day);
    }
}

发表于 2017-04-10 19:40:52 回复(0)
#include <iostream>
using namespace std;

int ping[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int run[12]  = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool isPing( int year ) {
    if( year % 400 == 0 )
        return false;
    else if( year % 4 == 0 && year % 100 != 0 )
        return false;
    return true;
}

int main() {
    int year, month, day, n;
    while( cin >> year >> n ) {
        if( isPing(year) ) {
            month = 0;
            while( n>0 ) {
                day = n;
                n -= ping[month];
                month++;
            }
        } else {
            month = 0;
            while( n>0 ) {
                day = n;
                n -= run[month];
                month++;
            }
        }
        if( month < 10 && day >= 10 )
            cout << year << "-0" << month << "-" << day << endl;
        else if( month >= 10 && day < 10)
            cout << year << "-" << month << "-0" << day << endl;
        else if( month < 10 && day < 10 )
            cout << year << "-0" << month << "-0" << day << endl;
        else
            cout << year << "-" << month << "-" << day << endl;
    }
    return 0;
}


发表于 2017-04-07 16:56:40 回复(0)
#include<iostream>

using namespace std;
bool isleap(int year)
{
    if((year%4==0&&year%100!=0)||(year%400==0))
        return true;
    return false;
}
void getDay(int year,int num)
{
     bool flag=isleap(year);
     int leap[12]={31,29,31,30,31,30,31,31,30,31,30,31};
     int y[12]={31,28,31,30,31,30,31,31,30,31,30,31};
     int sum=0;
     if(flag)
     {
         for(int i=0;i<12;i++)
         {
             sum+=leap[i];
             if(sum>=num)
             {
                 if(i+1>=10)
                 {
                     if((leap[i]-sum+num)>=10)
                         cout<<year<<"-"<<i+1<<"-"<<(leap[i]-sum+num)<<endl;
                     else
                         cout<<year<<"-"<<i+1<<"-0"<<(leap[i]-sum+num)<<endl;
                 }
                 else
                 {
                     if(leap[i]-sum+num>=10)
                         cout<<year<<"-0"<<i+1<<"-"<<(leap[i]-sum+num)<<endl; 
                     else
                         cout<<year<<"-0"<<i+1<<"-0"<<(leap[i]-sum+num)<<endl; 
                 }  
                 break;
             }
         }
     }
     else
     {
         for(int i=0;i<12;i++)
         {
             sum+=y[i];
             if(sum>=num)
             {
                 if(i+1>=10)
                 {
                     if((y[i]-sum+num)>=10)
                         cout<<year<<"-"<<i+1<<"-"<<(y[i]-sum+num)<<endl;
                     else
                         cout<<year<<"-"<<i+1<<"-0"<<(y[i]-sum+num)<<endl;
                 }
                 else
                 {
                     if(y[i]-sum+num>=10)
                         cout<<year<<"-0"<<i+1<<"-"<<(y[i]-sum+num)<<endl; 
                     else
                         cout<<year<<"-0"<<i+1<<"-0"<<(y[i]-sum+num)<<endl; 
                 }  
                 break;
             }
         }
     }
}
int main()
{
    int year,num;
    while(cin>>year>>num)
    {
        getDay(year,num);
    }
    return 0;
}

发表于 2016-08-22 16:33:56 回复(0)
/**
只要建立一个数组,用于查表就好,把闰年的情况独立出来,也就是说把二月改一下即可。
而且天数只会最多有366天,也就是加一年而已,完全不用再考虑第二年情况!!
*/
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			fun(in.nextInt(), in.nextInt());
		}
		in.close();
	}
	
	public static void fun(int a, int b){
		int[] month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
		if(a % 4 == 0 && a % 100 != 0 || a % 400 == 0)
			month[1] = 29;
		int i;
		for(i = 0; i < 12; i++){
			if(b <= month[i])
				break;
			else
				b -= month[i];
		}
		if(i == 11 && b > 31)
			a++;
		String str = String.format("%d-%02d-%02d",a, i+1, b);
		System.out.println(str);
	}
}


编辑于 2017-02-06 17:48:11 回复(0)

建立两个数组分别存放闰年和非闰年的各个月份对应天数。

#include <cstdio>
using namespace std;
int a[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31},
b[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
 int year, day, month;
 while(scanf("%d%d", &year, &day) != EOF){
  month=0;
  if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
     while (day > b[month])
        day -= b[month++];
  else
      while (day > a[month]) {
        day -= a[month++];
    printf("%04d-%02d-%02d\n", year, month, day);
 }return 0;
}
编辑于 2019-09-27 15:22:15 回复(5)

使用python的datetime库,美滋滋。

import datetime

while True:
    try:
        year, day = map(int, input().split())
        first_day = datetime.datetime(year, 1, 1)
        delta = datetime.timedelta(days=day - 1)
        print(datetime.datetime.strftime(first_day + delta, "%Y-%m-%d"))


    except:
        break
发表于 2017-10-04 08:50:08 回复(0)

思路:

    1. 先判断输入的年是闰年还是平年,闰年2月是29天,平年二月是28天
        闰年的判定方法:
                    ---能被4整除,不能被100整除 或者是  ---能被400整除
    2. 定位是哪一个月
                    (1).定义一个天数数组,遍历天数数组,
                    (2).如果(n - 当前月的天数) >0
                        n -= 当前月的天数,跳到下一个月
                    直到 n<= 当前月的天数
    3. 定位到月之后,再判断是哪一天,在第二步得到n的值即可
#include <iostream>
using namespace std;

void printDate(int year, int month, int day)
{
    cout << year  << '-' ;
    if (month < 10)
    {
        cout << '0' << month  << '-' ;
    }
    else cout << month << '-' ;

    if (day < 10)
    {
        cout << '0' << day << endl;
    }
    else cout << day << endl;
}

int main()
{
    static char 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 }
    };
    int year, day_of_year, leap, i;
    while (cin >> year >> day_of_year)
    {
        leap = ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));
        for (i = 0; i < 13; i++)
        {
            if (day_of_year > daytab[leap][i])
            {
                day_of_year -= daytab[leap][i];
            }
            else break;
        }
        if (i == 13) i -= 12;
        printDate(year, i, day_of_year);
    }
    return 0;
}
发表于 2017-05-11 18:34:04 回复(3)