首页 > 试题广场 >

计算一年中的第几天

[编程题]计算一年中的第几天
  • 热度指数:4276 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解

今年的第几天?

输入年、月、日,计算该天是本年的第几天。


输入描述:
包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。


输出描述:
输入可能有多组测试数据,对于每一组测试数据,
输出一个整数,代表Input中的年、月、日对应本年的第几天。
示例1

输入

1990 9 20
2000 5 1

输出

263
122

Python3

import datetime

while True:
    try:
        y, m, d = map(int, input().split())
        date = datetime.datetime(y, m, d)
        print(date.strftime("%j").lstrip("0"))
    except:
        break

需要注意的是:

  • datetime的参数全为整数。
  • 在输出是第几天时,前面可能带有0,所以要把前面的0去掉。

可以写成一行:

import datetime

while True:
    try:
        print(datetime.datetime(*map(int, input().split())).strftime("%j").lstrip("0"))
    except:
        break
发表于 2019-02-23 09:32:39 回复(0)
import java.util.Scanner;

/**
 * 计算一年中的第几天
 * 今年的第几天?
 * 输入年、月、日,计算该天是本年的第几天。
 * 输入描述:
 * 包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。
 * 输出描述:
 * 输入可能有多组测试数据,对于每一组测试数据,
 * 输出一个整数,代表Input中的年、月、日对应本年的第几天。
 * 输入例子1:
 * 1990 9 20
 * 2000 5 1
 * 输出例子1:
 * 263
 * 122
 *
 * @author shijiacheng
 * @date 2018/2/21
 */
public class DayOfYeafSolution {
    public static void main(String[] args){
        int[] days = {31,28,31,30,31,30,31,31,30,31,30,31};
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()){
            int Y = sc.nextInt();
            int M = sc.nextInt();
            int D = sc.nextInt();

            if (isLeapYear(Y)){
                days[1] = days[1]+1;
            }

            int day = 0;
            for (int i = 1; i < M; i++) {
                day+=days[i-1];
            }
            day +=D;
            System.out.println(day);
        }
    }

    /**
     * 判断是否是闰年
     * @param year
     * @return
     */
    public static boolean isLeapYear(int year){
        if (year%4==0&&year%100!=0){
            return true;
        }else if (year%400==0){
            return true;
        }
        return false;
    }
}
发表于 2018-02-21 15:09:49 回复(0)
先判断闰年后,然后用vector动态创建数组,直接相加就好。
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
    int year, month, day;
    while (cin >> year >> month >> day)
    {
        int count = 0;
        int Feb = 28;
        if (year % 4 == 0 || year % 400 == 0)
        {
            Feb = 29;
        }
        vector<int> monthcount = { 0,31,Feb,31,30,31,30,31,31,30,31,30,31 };
        for (int i = 0; i < month; i++)
        {
            count += monthcount[i];
        }
        count += day;
        cout << count << endl;
    }
    return 0;
}


发表于 2019-04-29 12:02:47 回复(0)
链接:https://www.nowcoder.com/questionTerminal/178aa3dafb144bb8b0445edb5e9b812a
来源:牛客网
知识点:
1.瑞年的判断:若year%400==0 or (year%100!=0)&&(year%4==0),则该年为瑞年,否则为平年。 

C++代码实现:
#include<iostream>
using namespace std;
int days(int year,int month,int day);
int main()
{
    int year,month,day;
    while(cin>>year>>month>>day)
    {
        cout<<days(year,month,day)<<endl;
    }
    return 0;
}
int days(int year,int month,int day)
{
    int month_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    if((year%400==0)||((year%4==0)&&(year%100!=0))){
        month_day[1]=29;
    }
    int sumday=day;
    for(int i=0;i<month-1;i++)
    {
        sumday+=month_day[i];
    }
    return sumday;
}
发表于 2019-09-09 09:51:19 回复(0)
傻瓜解法

#include <iostream>

using namespace std;

int main()
{
    int d1[12]={31,29,31,30,31,30,31,31,30,31,30,31};
    int d2[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    int year,month,day;
    while(cin>>year>>month>>day)
    {
        int num=0;
        if((year % 4 == 0 && year % 100 != 0)||(year%400 ==0))
        {
            for(int i=0;i<month-1;i++)
            {
                num += d1[i];
            }
            num=num+day;
            cout<<num<<endl;
        }
        else
        {
            for(int i=0;i<month-1;i++)
            {
                num += d2[i];
            }
            num=num+day;
            cout<<num<<endl;
        }
    }
    return 0;
}

ps:
请教一下,请看到的大神解答一下,为什么下面这个不行
#include <iostream>   using namespace std;   int main() {     int d1[12]={31,29,31,30,31,30,31,31,30,31,30,31};     int d2[12]={31,28,31,30,31,30,31,31,30,31,30,31};     while(cin)     {         int year,month,day;         int num=0;         cin>>year>>month>>day;         if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)         {             for(int i=0;i<month-1;i++)             {                 num += d1[i];             }             num=num+day;                       }         else         {             for(int i=0;i<month-1;i++)             {                 num += d2[i];             }             num=num+day;         }         cout<<num<<endl;     }     return 0; }

编辑于 2019-05-17 21:32:08 回复(0)
#include <bits/stdc++.h>

using namespace std;

int main()
{     int Y,M,D,d;     int m[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};     while(cin>>Y>>M>>D){         d = D;         for(int i=0;i<M;i++)             d += m[i];         if(Y%4==0 && Y%100!=0 || Y%400==0)             d += 1;         cout<<d<<endl;     }     return 0;
}

发表于 2019-02-17 02:41:09 回复(0)
import java.util.*;
public class Main {
    private static final int[] M_DAYS = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int year = sc.nextInt();
            int month = sc.nextInt();
            int day = sc.nextInt();
            if ( (year % 400 == 0) || (year % 4 == 0 && year % 100 !=0) ) {
                M_DAYS[2] = 29;
            }
            int ans = 0;
            for (int i=1; i<month; i++) {
                ans += M_DAYS[i];
            }
            ans += day;
            System.out.println(ans);
            M_DAYS[2] = 28;
        }
        return;
    }
}
发表于 2019-01-24 17:05:54 回复(0)
import java.util.Scanner;

public class test2 {
    public static void main(String[] args){
        int D=0;
        int [] date={31,28,31,30,31,30,31,31,30,31,30,31};
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入年月日:");
        while(sc.hasNextInt()){
            int year=sc.nextInt();
            int month=sc.nextInt();
            int day=sc.nextInt();
            if(year%400==0||year%100==0){
                date[1]=29;}
            for(int i=0;i<month-1;i++){
            D+=date[i];    }
            System.out.print("该天是本年的第"+(D+day)+"天");
        }    
        
    }

发表于 2018-03-12 16:54:59 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 每个月的天数,平年
        int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        // 循环处理多组测试数据
        while (scanner.hasNext()) {
            int year = scanner.nextInt();
            int month = scanner.nextInt();
            int day = scanner.nextInt();

            // 判断是否为闰年
            boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);

            // 计算总天数
            int totalDays = 0;
            // 累加前面月份的天数
            for (int i = 0; i < month - 1; i++) {
                totalDays += daysInMonth[i];
            }
            // 加上当月的天数
            totalDays += day;
            // 如果是闰年且月份大于2月,加1天
            if (isLeapYear && month > 2) {
                totalDays++;
            }

            System.out.println(totalDays);
        }

        scanner.close();
    }
}

发表于 2025-08-28 18:42:44 回复(0)
def is_runyear(x):
    if (x%4==0 and x%100!=0) or x%400==0:
        return True
    else:
        return False

days_of_month = [31,28,31,30,31,30,31,31,30,31,30,31]
while True:
    try:
        Y,M,D = map(int,input().split())
        if M==1:
            answer = D
        elif M==2:
            answer = 31+D
        else:
            if is_runyear(Y):
                days_of_month[1] = 29
            answer = sum(days_of_month[0:M-1])+D
        print(answer)
    except:
        break
发表于 2025-08-24 22:39:40 回复(0)
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int year, month, day;
    cin >> year >> month >> day;
    vector<int> monthday = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    bool isrunnian = false;
    if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
        isrunnian = true;
    }
    int sum = 0;
    for(int i = 0; i < month - 1; ++i){
        sum += monthday[i];
    }
    sum += day;
    if(isrunnian && month > 2){
        sum++;
    }
    cout << sum;
}
// 64 位输出请用 printf("%lld")

发表于 2025-08-20 19:05:47 回复(0)
#include <iostream>
#include <map>
#include <vector>
using namespace std;

// 闰年:366 2月 29天
// 平年:365 2月 28天

// 基本规则:如果年份能被 4 整除,则可能是闰年。
// 例外:
// 如果年份能被 100 整除但不能被 400 整除,则是平年。
// 如果年份能被 400 整除,则是闰年。
// 数学表达:
// 闰年条件:(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)。
// 否则为平年。


int of_day(int y,int m,int d){
    vector<int> v(13);

    if((y%4==0 && y%100!=0) || y%400==0) v={0,31,29,31,30,31,30,31,31,30,31,30,31};
    else v={0,31,28,31,30,31,30,31,31,30,31,30,31};

    int ans=0;
    for (int i=1; i<m;i++) {
        ans+=v[i];
    }
    ans+=d;

    return ans;

}


int main() {

    int y,m,d;

    while (cin>>y>>m>>d) {
        cout<<of_day(y,m,d)<<endl;
    }


}
// 64 位输出请用 printf("%lld")
发表于 2025-08-04 23:06:50 回复(0)
import sys
month_day = [31,59,90,120,151,181,212,243,273,304,334,365]
for line in sys.stdin:
    y,m,d = map(int,line.split())

    # 平年天数
    days = month_day[m-2] + d

    # 闰年天数,如大于2月则在平年天数上加1天
    if y % 4 == 0 and y % 100 != 0&nbs***bsp;y % 400 == 0:
        if m > 2:
            days += 1

    print(days)

发表于 2025-07-29 20:28:43 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别

        HashMap<Integer, Integer> pingYear = new HashMap<>();
        pingYear.put(1, 31);
        pingYear.put(2, 28);
        pingYear.put(3, 31);
        pingYear.put(4, 30);
        pingYear.put(5, 31);
        pingYear.put(6, 30);
        pingYear.put(7, 31);
        pingYear.put(8, 31);
        pingYear.put(9, 30);
        pingYear.put(10, 31);
        pingYear.put(11, 30);

        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            int b = in.nextInt();
            int c = in.nextInt();
            int day  = 0;

            for (Map.Entry<Integer, Integer> map : pingYear.entrySet()) {
                int key = map.getKey();
                int value = map.getValue();
                if ( key > b - 1) {
                    day = day + c;
                    break;
                }
                day = day + value;
            }
            if (isRunYear(a)) {
                if (b > 1) {
                    day += 1;
                }
            }
            System.out.println(day);

        }
    }

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

发表于 2025-07-20 11:42:18 回复(0)
题目变了 原来只判断一个 现在需要循环判断n个 所以榜上前面的都是旧代码 新的要求的代码达不到那么快
发表于 2025-06-30 14:07:22 回复(0)
#include <stdio.h>

int main() {
    int Y,M,D,TIAN,i;
    int M_day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    while(1)
    {
        TIAN = 0;
        scanf("%d %d %d", &Y,&M,&D);
        if((Y<1)||(Y>3000)||(M<1)||(M>12)||(D<1)||(D>31)){
            printf("input error!\n");
            return 0;
        }
        //年,考虑闰月,能被4整除且不能被100整除,或能被400整除的年份为闰年
        if(((Y%4 == 0)&&(Y%100 != 0))  || (Y%400 == 0)){
            if(M > 2){
                TIAN++;//闰年时,月份大于2月时加1天          
            }
        }
        //月,1、3、5、7、8、10、12月为31天,2月为28或者29天
        for(i = 0;i < M;i++)//1月的时候加当月日期加的是0,放在日中计算
        {
            TIAN += M_day[i];
        }
        //日
        TIAN += D;//加上输入的日
        printf("%d\n",TIAN);
    }
    return 0;
}
发表于 2025-06-25 17:06:06 回复(0)
#include <stdio.h>
int isRun();

int main() {
    int year,mon,day;
    int days[13] = {0,31,29,31,30,31,30,31,
                    31,30,31,30,31};

    while (scanf("%d%d%d",&year,&mon,&day)!=EOF){
        int total = 0;
       
        if(day > days[mon] ||(isRun(year)==0&&mon==2&&day>28)) {
            printf(" there is no %d days in month %d",day,mon);
            return 0;
        }
        for(int i = 1; i < mon; i++) {
            total += days[i];
        }
        total += day;

        if(mon > 2 && isRun(year) == 0) {
            total -= 1;
        }
        printf("%d\n",total);
    }


}

int isRun(int year) {
    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { // 是闰年
        return 1;
    }
    else return 0;
}

发表于 2024-03-26 10:57:44 回复(0)
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Scanner; public class TestDate { public static void main(String[] argvs) throws ParseException {
        Scanner sc=new Scanner(System.in); while(sc.hasNext()){
            String dateStr=sc.nextLine();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy MM dd");
            Date date= null;
            date=sdf.parse(dateStr);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date); int index=calendar.get(Calendar.DAY_OF_YEAR);
            System.out.println(index);
        }
    }
}
发表于 2020-03-12 09:38:37 回复(0)
使用Date API Calendar SimpleDateFormat 代码量少,好做
发表于 2019-07-28 22:21:56 回复(0)
#include<stdio.h>
#include<iostream>
int main()
{       int year,month,day;
        int sum=0;
        int flag = 0;
        int days = 0;
        scanf("%d %d %d",&year,&month,&day);
        if(year%4==0)
        {
            flag=1;
            if(year%100==0&&year%400==0)
            {flag=1;}else   {flag = 0;}
        }
        for(int i=1;i<month;i++)
        {
            if((1==i)||(3==i)||(5==i)||(7==i)||(8==i)||(10==i)||(12==i))
            {
                days = 31;
                sum = sum +days;
                continue;
            }else if((4==i)||(6==i)||(9==i)||(11==i))
            {
                days = 30;
                sum = sum +days;
                continue;
            }else
                {
                switch (flag)
                {
                case 0:
                    sum=sum+28;  break;
                case 1:
                    sum=sum+29; break;
                default:
                    break;
                }
            }
            sum = sum +day;
    }
            printf("%d\n",sum);
    return 0;
}
初来乍到,新手小白一般写法,请多指教
发表于 2019-06-27 09:23:03 回复(0)