0038-算一算是一年中的第几天

题目

算一算是一年中的第几天
难度级别:A; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述

给定一个具体的日期,请你计算出这一天是当年的第几天。

输入
输入格式为:year-month-day
输出
一个符合题目要求的正整数。
输入示例
2007-2-3
输出示例
34
其他说明
数据范围:日期符合日期的基本规律,正整数 year 不会超过 10000 。

分析

    分支题的加强版。需要多算一算,并考虑闰年的情况。

代码

#include<bits/stdc++.h>
using namespace std;
int day,month,year,sum,leap;
int main()
{
	scanf("%d-%d-%d",&year,&month,&day);
	switch(month)//累加前month个月的总天数。
	{
		case 1:sum=0;break;
		case 2:sum=31;break;
		case 3:sum=59;break;
		case 4:sum=90;break;
		case 5:sum=120;break;
		case 6:sum=151;break;
		case 7:sum=181;break;
		case 8:sum=212;break;
		case 9:sum=243;break;
		case 10:sum=273;break;
		case 11:sum=304;break;
		case 12:sum=334;break;
		default:printf("data error!");
	}
	sum+=day;
	if(!(year%400)||(!(year%4)&&(year%100))) leap=1;//判断闰年。
	else leap=0;
	if(leap==1&&month>2) sum++;//闰年二月后多一天。
	printf("%d",sum);
	return 0;
}

转载于:https://www.cnblogs.com/DARTH-VADER-EMPIRE/p/9501729.html

<think>嗯,用户让我用C++编写一个程序,计日期在一年中的第几天,而且不能用函数。好的,我得仔细想想怎么做。首先,我需要明确输入是什么,应该是一个日期,比如年、月、日,然后输出是这一年第几天。 那怎么开始呢?可能需要用户输入年月日三个整数。然后,我需要计从1月到该月之前所有月份的天数之和,再加上当月的天数。比如,如果是3月5日,那就要1月和2月的总天数,再加上5天。 不过这里有个问题,就是闰年的二月天数不同。闰年的判断条件是能被4整除但不能被100整除,或者能被400整除。所以,在计二月的天数时,需要先判断是否是闰年。那这一步应该放在哪里呢?可能在处理月份的时候,当月份超过2月时,才需要判断闰年来决定是否加1天? 或者,先判断是否是闰年,然后根据结果来确定二月的天数。比如,如果是闰年,二月有29天,否则28天。这样,在累加各个月份的天数时,可以提前确定二月的天数。 那月份的天数可以用一个数组来存储,比如非闰年的情况:{31,28,31,30,...}。如果是闰年,就把二月改成29天。或者,在计的时候,当月份超过2月时,再加上闰年带来的1天? 比如,假设不是闰年,每个月的天数按正常计,但如果月份大于2且是闰年的话,总天数加1。这样可能更方便,不需要修改数组。比如,数组是固定的非闰年每月天数,计总和后,如果月份超过2月且是闰年,就加1天。 这样的话,步骤大概是: 1. 输入年、月、日。 2. 检查输入的有效性,比如月份在1-12之间,日期不超过该月的天数。不过用户可能没有要求错误处理,所以可能暂时不考虑。 3. 计前几个月的天数总和,比如月份是3的话,就加1月和2月的天数。 4. 加上当月的日期。 5. 如果是闰年且月份超过2月,总天数加1。 那具体怎么实现呢?例如,定义一个数组存储每个月的天数,初始为非闰年。然后,计总和的时候,如果月份超过2月,并且是闰年,就额外加1天。 比如数组是:int days_in_month[] = {31,28,31,30,31,30,31,31,30,31,30,31}; 注意这里可能有12个月的数据,所以数组大小应该是12,索引从0到11,对应1月到12月? 或者,用户输入的月份是1到12,所以循环的时候,从0到month-2?比如,假设当前月份是3月,那么需要累加前两个月的天数,也就是数组的前两个元素,即0和1索引的元素。 比如,假设输入的月份是m,那么循环i从0到m-2,累加days_in_month[i]。例如,当m=3时,i=0和1,对应1月和2月。 然后再加上当月的天数d。然后,如果是闰年且m>2,总天数加1。 这样是否正确? 那判断闰年的函数应该怎么写?但是用户要求不能用函数,所以得直接在代码里写判断条件。例如: bool is_leap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); 然后,如果月份大于2且是闰年,总天数加1。 那整个代码的结构大概是这样的: #include <iostream> using namespace std; int main() { int year, month, day; cin >> year >> month >> day; int days_in_month[] = {31,28,31,30,31,30,31,31,30,31,30,31}; int total = 0; // 累加前month-1个月的天数 for (int i = 0; i < month -1; ++i) { total += days_in_month[i]; } total += day; // 判断闰年且月份超过2月 bool is_leap = (year %4 ==0 && year %100 !=0) || (year%400 ==0); if (is_leap && month >2) { total +=1; } cout << total << endl; return 0; } 那这个代码是否正确呢?比如,比如2020年3月1日,是否计正确? 非闰年的话,1月31,2月28,总和是59,加上3月1日就是60。如果是闰年,则总和是59+1=60,加上日期1,总共有60天?或者原计总和是31+28=59,加上闰年的话,总和是59+1=60,加上当月的1天,得到61? 比如,2020年3月1日,应该是31(1月)+29(2月)+1=61天?那按照上面的代码,当month=3,循环i从0到1(因为month-1=2,循环条件是i <2),所以i=0和1,累加31和28,得到59。然后加上day=1,得到60。然后因为is_leap为true且month>2,所以加1,得到61。所以是正确的。 那代码是正确的。那这就是解决方案。用户要求不用函数,所以没有将闰年判断写成函数,而是直接在代码中进行。 不过,是否还有其他情况需要考虑?比如输入的月份是1的情况?比如,当月份是1时,循环不执行,total就是0,然后加上day。例如,1月5日,得到5天,正确。 另外,输入的day是否超过当月的最大天数?比如用户输入了2月30日,但程序没有进行错误检查。但用户可能没有要求错误处理,所以可以忽略。 综上,这样的代码应该可以解决问题。</think>以下是计一年第几天的C++实现步骤: ```cpp #include <iostream> using namespace std; int main() { int year, month, day; cout << "请输入日期(年 月 日):"; cin >> year >> month >> day; // 定义非闰年每月天数(1月到12月) int days_in_month[] = {31,28,31,30,31,30,31,31,30,31,30,31}; int total_days = day; // 初始化总天数为当前日期的天数 // 累加前几个月的天数(注意数组下标从0开始) for (int i = 0; i < month - 1; ++i) { total_days += days_in_month[i]; } // 处理闰年且月份超过2月的情况 if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { if (month > 2) { total_days += 1; // 闰年2月多1天 } } cout << "该日期是当年的第" << total_days << "天" << endl; return 0; } ``` **代码原理分步说明:** 1. **输入处理** - 用户输入年、月、日三个整数,例如:`2023 5 15` 2. **基础数据存储** - 创建数组`days_in_month`存储非闰年每月天数(1月到12月) 3. **累计前几个月天数** - 循环累加从1月到前一个月的总天数(例如输入5月时,累加1~4月的天数) 4. **闰年判断与修正** - 闰年条件:能被4整除但不能被100整除,或能被400整除 - 若当前年份是闰年且月份超过2月,总天数额外加1 5. **输出结果** - 最终计的总天数即为该日期在一年中的位置 **示例验证** 以2020年3月1日(闰年)为例: - 非闰年总天数 = 31(1月) + 28(2月) + 1(3月1日) = 60 - 闰年修正后总天数 = 60 + 1 = 61 程序输出结果正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值