首页 > 试题广场 >

今年的第几天

[编程题]今年的第几天
  • 热度指数:7611 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

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

输入:

包括三个整数年、月、日。

输出:

输出一个整数,代表Input中的年、月、日对应本年的第几天。

数据范围:输入的年 ,输入的月满足 , 输入的日满足


输入描述:
输入:1990 9 20


输出描述:
输入:263
示例1

输入

2000 5 1 

输出

122

备注:
注意闰年的判定方式
/*
安全。
无坑。
上代码。
*/
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int[] mons = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        while (in.hasNext()) {
            int year = in.nextInt();
            int month = in.nextInt();
            int day = in.nextInt();
            if (isLeap(year)) mons[2] = 29;
            int ans = 0;
            for (int i = 1; i < month; i++) {
                ans += mons[i];
            }
            ans += day;
            System.out.println(ans);
        }
    }

    static boolean isLeap(int year) {
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
            return true;
        return false;
    }
}

发表于 2019-06-29 14:43:25 回复(3)
#include <iostream>
using namespace std;

// 闰年 二月份29天
// 普通闰年 - 能被4整除但不能被100整除
// 世纪闰年(1000,2000,3000等) - 能被400整除
int main(){
    // 1 3 5 7 8 10 腊,三十一天永不差
    // 闰年 - 2月份有29天
    int year, month, day;
    cin >> year >> month >> day;
    if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){
        //普通闰年 / 世纪闰年
        int sum = 0;
        if(month == 1){
            cout << day << endl;
            return 0;
        }
        else{
            for(int i = 1; i < month; ++i){
                if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8
                   || i == 10 || i == 12) {
                    sum += 31;
                } else if (i == 2){
                    sum += 29;
                } else {
                    sum += 30;
                }
            }
            sum += day;
            cout << sum << endl;
            return 0;
        }
    }
    else {
        //不是闰年
        if(month == 1){
            cout << day << endl;
            return 0;
        }
        int sum = 0;
        for(int i = 1; i < month; ++i){
            if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8
               || i == 10 || i == 12) {
                sum += 31;
            } else if (i == 2){
                sum += 28;
            } else {
                sum += 30;
            }
        }
        sum += day;
        cout << sum << endl;
        return 0;
    }
    return 0;
}

发表于 2020-05-24 12:13:49 回复(0)
利用C库中struct tm结构体,应该没是有bug,又简洁的

#include <iostream>
#include <time.h>

using namespace std;

#pragma warning(disable : 4996)

int main()
{
    int year, month, day;
    cin >> year >> month >> day;

    time_t rawtime;
    time(&rawtime);
    struct tm * date = localtime(&rawtime);
    date->tm_year = year - 1900;
    date->tm_mon = month - 1;
    date->tm_mday = day;
    mktime(date);

    cout << date->tm_yday + 1 << endl;

    system("pause");
}
发表于 2019-09-07 11:37:56 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int y,m,d,num[12]={31,28,31,30,31,30,31,31,30,31,30,31},da=0;
    cin>>y>>m>>d;
    if(y%4==0&&y%100!=0||y%400==0)
    {
        if(m<=2)
        {
            for(int i=0;i<m-1;i++)
                da+=num[i];
            da+=d;
        }
        else
        {
            for(int i=0;i<m-1;i++)
                da+=num[i];
            da=da+d+1;
        }
    }
    else
    {
        for(int i=0;i<m-1;i++)
            da+=num[i];
        da+=d;
    }
    cout<<da<<endl;
    return 0;
}

发表于 2019-07-02 10:19:30 回复(0)
[y, m, d] = list(map(int, input().split()))
days = [31,28,31,30,31,30,31,31,30,31,30,31]
if (y%100 == 0 and y%400 == 0) or (y%100 != 0 and y%4 == 0):
    days[1] = 29
res = 0
for i in range(m-1):
    res += days[i]
res += d
print(res)

发表于 2019-07-18 14:57:07 回复(0)
#include<iostream>
using namespace std;

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


发表于 2021-05-06 17:21:11 回复(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);
        int year = scanner.nextInt();
        int month = scanner.nextInt();
        int day = scanner.nextInt();
        LocalDate date = LocalDate.of(year, month, day);
        LocalDate date01 = LocalDate.of(year, 1, 1);
        long days = date01.until(date, ChronoUnit.DAYS);
        System.out.println(days+1);
    }
}


发表于 2020-02-29 16:32:05 回复(0)
#include<bits/stdc++.h>
using namespace std;
#define LEAP(x) x%100!=0 && x%4==0 || x%400==0 ? 1:0
int day_of_month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
    int year,month,day;
    while(scanf("%d%d%d",&year,&month,&day)!=EOF){
        int i,ans=0;
        for(i=1;i<month;i++){
            ans=ans+day_of_month[i];
        }
        ans+=day;
        if(month>2 && LEAP(year))
            ans++;
        cout<<ans<<endl;
    }
}
发表于 2020-02-06 12:07:45 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
    int year,mon,day;
    while(cin>>year>>mon>>day)
        cout<<accumulate(days,days+mon-1,day+(year%400==0||(year%4==0&&year%100!=0)));
    return 0;
}
应该不能更简洁无误了。
利用c++ STL accumulate

编辑于 2020-02-05 17:31:31 回复(0)
#include <bits/stdc++.h>
using namespace std;

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

发表于 2019-11-15 01:09:04 回复(0)
#include<bits/stdc++.h>
using namespace std;

int f[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

bool run(int y) {
	return (y%400==0 || (y%4==0 && y%100!=0));
}
int main() {
	int y,m,d;
	while (cin >> y >> m >> d) {
		bool isY = run(y);
		int sum = 0;
		for (int i=1; i<m; ++i) {
			sum += f[i];
		}
		sum += d;
		if (isY) {
			cout << (sum+1) <<endl;
		} else {
			cout << sum <<endl;
		}
	}
	return 0;
}


发表于 2019-10-19 19:08:31 回复(0)
#include<iostream>
using namespace std;
int main() {
    int ans = 0;
    int mons[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    int y, m, d;
    cin >> y >> m >> d;
    for (int i = 1; i < m; i++)
        ans += mons[i];
    if ((y % 4==0 && y % 100!=0 || y % 400==0) && m > 2)
        ans++;
    cout << ans+d << endl;
}
发表于 2019-10-04 03:39:52 回复(0)
#include <iostream>
using namespace std;
int main(){
    int year, month, day;
    int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    while (cin >> year >> month >> day){
        int daySum = 0;
        if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
            daySum += 1;
        while (month > 0){
            daySum += a[--month];
        }
        cout << daySum + day << endl;
    }
    return 0;
}

发表于 2019-09-15 14:18:41 回复(0)
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
//36
/*
 * 输入年、月、日,计算该天是本年的第几天。 
     输入: 
     包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。 
     输出:  输入可能有多组测试数据,对于每一组测试数据, 
     输出一个整数,代表Input中的年、月、日对应本年的第几天。 
     输入:1990 9 20
     输出描述:
     输入:263*/
public class Main{
	public static void main(String[] args) throws ParseException {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNextLine()){
			String s = sc.nextLine();
			SimpleDateFormat sf = new SimpleDateFormat("yyyy MM dd");
			Date now =  sf.parse(s);
			String oneDay = s.substring(0,4)+" 1"+" 1";
			Date start = sf.parse(oneDay);
			long days = (now.getTime()-start.getTime())/(1000*3600*24)+1;
			System.out.println(days);
			
		}
	}
}

发表于 2019-09-12 10:47:48 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int year = sc.nextInt();
        int month = sc.nextInt();
        int day = sc.nextInt();
        Calendar cal = Calendar.getInstance();
        cal.set(year, month - 1, day);
        System.out.println(cal.get(Calendar.DAY_OF_YEAR));
    }
}

发表于 2019-09-09 21:38:17 回复(0)
可直接查表,闰年时加1即可。当月份小于三时没有影响。
#include <iostream>

using namespace std;
 
int main()
{
    int y, m, d;
    int md[12] = {0,31,59,90,120,151,181,212,243,273,304,334};
    cin >> y >> m >> d;     
        if (y%4==0 && y%100!=0 || y%400==0) 
        cout<<md[m-1] + d +1;
    else 
        cout<<md[m-1] + d;
    return 0;
}


发表于 2019-09-08 18:15:49 回复(0)
穷举法: 按照日期所在月判断(算出前n个月有几天)闰年单用一个数值判断,是则加一再加上日期得出结果。注意1、2月份不用加闰年判断。我的代码没有加上非法日期判断,但是正常日期已经通过
#include<iostream>
using namespace std;
int main()
{
    int year;
    int month;
    int date;
    int count;
    int spe=0;//闰年记号
    cin>>year>>month>>date;
    if(year%4==0&&(year%100!=0||year%400==0)){spe=1;}
    switch(month)
    {
            case 1  :    count=date;break;
            case 2  :    count=date+31;break;
            case 3  :    count=date+31+28+spe;break;
            case 4  :    count=date+31+28+spe+31;break;
            case 5  :    count=date+31+28+spe+31+30;break;
            case 6  :    count=date+31+28+spe+31+30+31;break;
            case 7  :    count=date+31+28+spe+31+30+31+30;break;
            case 8  :    count=date+31+28+spe+31+30+31+30+31;break;
            case 9  :    count=date+31+28+spe+31+30+31+30+31+31;break;
            case 10 :    count=date+31+28+spe+31+30+31+30+31+31+30;break;
            case 11 :    count=date+31+28+spe+31+30+31+30+31+31+30+31;break;
            case 12 :    count=date+31+28+spe+31+30+31+30+31+31+30+31+30;break;
    }
    cout<<count<<endl;
}


发表于 2019-08-31 15:41:55 回复(0)
y, m, d = map(int, input().split())
is_leap = True if ((y % 400 == 0 and y % 3200 != 0) 
                   or (y % 4 == 0 and y % 100 != 0)) else False
months = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if not is_leap: months[1] = 28
sum_ = sum(months[:m-1])
print(sum_+d)

发表于 2019-08-29 13:42:53 回复(0)
y,m,d=list(map(int,input().split()))

year=[31,28,31,30,31,30,31,31,30,31,30,31]
res=0
for i in range(m-1):
    res+=year[i]
if (y%100==0 and y%400==0) or (y%100!=0 and y%4==0):
    if m>=3:
        res+=1

res+=d
print(res)

发表于 2019-08-22 15:33:03 回复(0)
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

bool IsLeapYear(int year)
{
    if(year%100 != 0 && year%4 == 0)
        return true;
    else if(year%400 == 0)
        return true;
    else
        return false;
}
int main()
{
    int year,month,day,days = 0;
    int a[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    while(cin>>year>>month>>day)
    {
        for(int i = 0;i<month;i++)
        days += a[i];
        days +=day;
    
        if(IsLeapYear(year) && month>2)
            cout<< days+1 <<endl;
        else
            cout<< days <<endl;
    }

    return 0;
}

发表于 2019-08-21 10:32:51 回复(0)