首页 > 试题广场 >

今年的第几天?

[编程题]今年的第几天?
  • 热度指数:35097 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入年、月、日,计算该天是本年的第几天。

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


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

输入

1990 9 20
2000 5 1

输出

263
122
#include <iostream>
using namespace std; 
int main(){
    int year,month,day;    
    while(cin>>year>>month>>day){
        int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        int date=0;
        if((year%4==0&&year%100!=0)||year%400==0){
            a[1]=29;
        }
        for(int i=0;i<month-1;i++){
            date+=a[i];
        }
        cout<<date+day<<endl;
    }
    return 0;
}

发表于 2017-12-09 19:37:25 回复(1)
#include<bits/stdc++.h>
using namespace std;

int monthtab[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 IsLeapYear(int y){//判断是否为闰年
    if(((y%4==0)&&(y%100!=0))||y%400==0){
        return 1;
    }else{
        return 0;
    }
}

int main(){
    int y,m,d;
    while(scanf("%d%d%d",&y,&m,&d)!=EOF){
        int num=0;
        int ans=IsLeapYear(y);
        for(int i=0;i<m;i++){
            num+=monthtab[ans][i];//如果为闰年,ans=1,正好加的是monthtab数组的闰年那一行
        }
        num+=d;
        cout<<num<<endl;
    }
    return 0;
}

发表于 2021-08-30 16:12:33 回复(0)
写个垃圾题解
using namespace std;
#include <iostream>
#include <cstring>
bool judge(int y){
    if(y%4 == 0){
        if(y % 100 == 0 and y%400){
            return false;
        }
        return true;
    }
    return false;
}

int main(){
    int sum[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 335}
    int y, m, d, ans;
    while(cin>>y>>m>>d){
        if(m>2 and judge(y))ans = 1;
        else ans = 0;
        ans += sum[m-1];
        cout<<ans<<endl;
    }
    return 0;
}


发表于 2021-06-09 16:40:31 回复(0)
#include<bits/stdc++.h>

using namespace std;

int md[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 getDayNo(int y, int m, int d)
{
    int f = (y % 400 == 0) || ((y % 4 == 0) && y % 100);
    int ans = 0;
    for(int i = 1;i < m; i++) ans += md[i][f];
    return (ans += d);
}

int main()
{
    int y, m, d;
    while(cin >> y >> m >> d)
    {
        cout << getDayNo(y, m, d) << '\n';
    }
    return 0;
}

发表于 2021-01-22 11:52:51 回复(0)

提交了好多遍都没有AC,发现原来是变量没有初始化为0;长个记性吧。

#include<stdio.h>
int main(){
    int year,month,day,res=0;
    int a[13] ={0,31,28,31,30,31,30,31,31,30,31,30,31};
    scanf("%d%d%d",&year,&month,&day);
    for(int i = 1;i<month;i++)
        res +=a[i];
    res+=day;
    if((year%4==0&&year%100!=0 || year%400 == 0)&&month>2)
        res=res+1;
    printf("%d\n",res);

}
编辑于 2021-01-17 16:54:21 回复(0)
#include<iostream>
using namespace std;


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


int main() {
    int month365[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int month366[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int year, month, day;
    while(cin>>year>>month>>day) {
        int res=0;
        int *month_days=is366(year)?month366:month365;
        for(int i=0; i<month-1; ++i) res+=*(month_days+i);
        res+=day;
        cout<<res<<endl;
    }
}

发表于 2020-05-04 20:25:04 回复(0)
#include<iostream>
using namespace std;

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

int main(){
	int y,m,d;
	int monthday[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	int sumday[13]={0};//数组如果不初始化会产生意想不到的结果 
	for(int i=1;i<=12;i++){//计算在第i个月之前月份的总天数 
		for(int j=1;j<i;j++){
			sumday[i]+=monthday[j];
		}
	}
	while(cin>>y>>m>>d){
		int day=0;
		day=sumday[m]+d;
		if(isLeapyear(y)&&m>=3){
			day++;
		}
		cout<<day<<endl;
	}
	return 0;
}




发表于 2020-03-15 19:38:34 回复(0)
使用Java8的新的时间API
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
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 mouth = scanner.nextInt();
            int day = scanner.nextInt();
            LocalDate date = LocalDate.of(year, mouth, day);
            LocalDate newYear = LocalDate.of(year, 1, 1);
            System.out.println(newYear.until(date, ChronoUnit.DAYS)+1);
        }
    }
}


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

int main()
{
    const int month_day[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int year,month,day;
    while(cin >> year >> month >> day){
         bool isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
            for(int i = 0; i < month - 1; ++i)
                day += month_day[i];
        cout << (month < 3 ? day : day + isLeapYear) << endl;
    }
    return 0;
}

发表于 2020-03-11 22:17:54 回复(0)
#include <iostream>
#include <stdio.h>
using namespace std;
int test_year(int year)
{
    if(year%400==0)
        return 1;
    else if(year%4==0 && year%100!=0)
        return 1;
    else
        return 0;
}
int main(void)
{
    int year,month,day,sum,i;
    int day_count_p[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int day_count_r[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};

    while(cin>>year>>month>>day)
    {
        sum=0;
        if(test_year(year)==0)
        {
            for(i=1;i<month;i++)
                sum+=day_count_p[i];
            sum+=day;
            cout<<sum<<endl;
        }
        else if(test_year(year)==1)
        {
            for(i=1;i<month;i++)
                sum+=day_count_r[i];
            sum+=day;
            cout<<sum<<endl;
        }
    }
    return 0;
}
发表于 2019-11-16 23:04:57 回复(0)
#include <iostream>
using namespace std;

int main()
{
    int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
    int year,mon,day,i;
    while(cin>>year>>mon>>day)
    {
        int sum=0;
        if((year%4==0&&year%100!=0)||year%400==0)
        {
            days[1]=29;
            for(i=0;i<mon-1;i++)
            {
                sum+=days[i];
            }
            sum+=day;
        }
        else
        {
            days[1]=28;
            for(i=0;i<mon-1;i++)
            {
                sum+=days[i];
            }
            sum+=day;
        }
        cout<<sum<<endl;
    }
    return 0;
}
编辑于 2019-09-06 10:49:50 回复(0)
import java.time.LocalDate;
import java.util.Scanner;

public class Main
{

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt())
        {
            LocalDate date = LocalDate.of(sc.nextInt(), sc.nextInt(), sc.nextInt());
            System.out.println(date.getDayOfYear());
        }
        sc.close();
    }

}

发表于 2018-08-01 13:39:53 回复(0)
#include<iostream>
using namespace std;
int SmallYear[13] ={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int BigYear[13] ={0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool isBigYear(int year)
{
    if((year % 100 != 0 && year % 4 == 0) ||(year % 100 == 0 && year % 400 == 0))
        return true;
    return false;
}
int main()
{
    int year, month, day;
    cin >> year >> month >> day;
    int ret = 0;
    if(isBigYear(year))
    {
        for(int i = 1; i < month; i++)
            ret = ret + BigYear[i];
        ret = ret + day;
    }
    else
    {
        for(int i = 1; i < month; i++)
            ret = ret + SmallYear[i];
        ret = ret + day;
    }
    cout << ret << endl;
}

发表于 2018-07-25 14:50:55 回复(0)
#include<iostream>
#include<cstring>
#define ISLEAP(x)  (x%4==0&&x%100!=0)||x%400==0?1:0
int YofM[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 Data {     int data;     int month;     int year;     Data() {         data = 1; month = 0; year = 0;     }     void nextdata() {         data++;         if (data>YofM[month][ISLEAP(year)]) {             month++; data = 1;             if (month>12)             {                 year++; month = 1;             }         }//if     }
};
int Daycount[3001][13][32];
int main() {     Data D;     int num = 0;     while (D.year <= 3000) {         Daycount[D.year][D.month][D.data] = num;         D.nextdata();         num++;     }//while     int d, m, y;     while (std::cin >> y >> m >> d) {                  int i = Daycount[y][m][d] - Daycount[y][1][1];         std::cout << i+1;     }//while     return 0;

}

发表于 2018-02-27 01:23:53 回复(0)
#include<stdio.h>
int main (int argc, char *argv[]){
    int daysOfMonth[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int y,m,d,days,i;
    for(;~scanf("%d %d %d",&y,&m,&d);)
        for(days=d,daysOfMonth[2]=(y%4==0&&y%100!=0) || (y%400==0)?29:28,i=0; i<m && (days += daysOfMonth[i] ); i==m-1?printf("%d\n",days):1,++i);
} 

发表于 2018-01-11 20:57:56 回复(1)
while 1:
    try:
        y,m,d=list(map(int,input().split()))
        m1=[31,29,31,30,31,30,31,31,30,31,30,31]
        m2=[31,28,31,30,31,30,31,31,30,31,30,31]
        if (y%4 == 0 and y%100 != 0) or (y%400 == 0):
            print(sum(m1[0:m-1])+d)
        else:
            print(sum(m2[0:m-1])+d)
    except:
        break

发表于 2017-09-02 15:33:37 回复(0)
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			String s=in.nextLine();
			String year = s.split(" ")[0];
			String firstDate=year+" "+"1"+" "+"1";
			SimpleDateFormat sdf=new SimpleDateFormat("yyyy MM dd");
			try {
				long val=sdf.parse(s).getTime()-sdf.parse(firstDate).getTime();
				val/=(1000*24*60*60);
				System.out.println(val+1);
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
	}
}
不通过
您的代码已保存
请检查是否存在数组越界非法访问等情况
case通过率为0.00%
Q:为何数组越界?

发表于 2016-12-07 08:21:49 回复(0)
#include<iostream>
#include<cstdio>
using namespace std;

#define ISYEAP(x) x%100!=0 && x%4==0 || x%400==0 ? 1 : 0        // 判断x 年是否为闰年

// 输入范围:年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)
// 3000 年 从 公元0年开始算相距天数也在int 的范围内
int num[3010][14][32] = {0};    // 存储每天到公元0年1月1日的天数

// 存储平年闰年的每个月有多少天
int days[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 Day;
    int Month;
    int Year;
    void nextDay() {    // 计算下一个日期
        Day ++;
        if(Day > days[Month][ISYEAP(Year)]) {
            // 如果超过的当月的最大天数则Month ++;
            Day = 1;
            Month ++;
            if(Month > 12) {
                Month = 1;
                Year ++;
            }
        }
    }
};

int main()
{
    Date tmp;
    int cnt = 0;    // 计数器
    tmp.Day = 1;
    tmp.Month = 1;
    tmp.Year = 0;
    while(tmp.Year != 3001) {
        num[tmp.Year][tmp.Month][tmp.Day] = cnt;
        tmp.nextDay();
        cnt++;
    }

    int y, m, d;
    while(cin >> y >> m >> d)
    {
        cout << num[y][m][d] - num[y][1][1] + 1 << endl;
    }

    return 0;
}


发表于 2016-08-01 10:59:58 回复(0)
注意整除100时也要整除400才是闰年
#include <stdio.h>
const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
    for(int y,m,d;~scanf("%d%d%d",&y,&m,&d);printf("%d\n",d)){
        for(int i=1;i<m;d+=month[i++]);
        if (y%400==0 || (y%100 && y%4==0)) d+=(m>2?1:0);
    }
    return 0;
}

编辑于 2016-08-31 17:18:25 回复(6)

python三行解法:

import datetime
while True:
    try:
        a,b,c=map(int,input().split())
        dd=datetime.datetime(a,b,c)
        print(dd.strftime("%j").lstrip("0"))



    except:
        break

需要注意的是,输出的结果前面有可能带0,所以要把左边的0使用lstrip去掉。

于是,上面的代码可以转为一行:

import datetime
while True:
    try:

        print(datetime.datetime(*map(int,input().split())).strftime("%j").lstrip("0"))



    except:
        break

我就想问,还有哪种语言比这个更简单。。

发表于 2017-10-04 14:12:23 回复(6)