文章

1

粉丝

0

获赞

4

访问

360

头像
P1825 相隔天数 答疑提问:正确率只有25%,呜呜呜
P1825 复旦大学机试
发布于2025年3月19日 12:02
阅读数 360

#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int isleapyear(int year){
	if((year%4==0&&year%100!=0)||(year%400==0)) return 1;
	else return 0;
}
ll jiange_day(int y1,int y2){
	int count=0;
	for(int i=y1+1;i<y2;i++)
		if(isleapyear(i)==1)
			count++;
	return (y2-y1-1)*365+count;
}
ll count_day(int year,int month,int day){
	int months[13]={31,28,31,30,31,30,31,31,30,31,30,31};
	if(isleapyear(year)==1) months[1]=29;
	ll sum=0;
	for(int i=0;i<month;i++)
		sum+=months[i];
	sum+=day;
	return sum;
}

int main(){
	string s;
	getline(cin,s);
	int y2=stoi(s.substr(0,4));
	int m2=stoi(s.substr(4,2));
	int d2=stoi(s.substr(6));
	int y1=2019,m1=2,d1=5;
	if(y1<=y2){
		ll sum1=count_day(y1,m1,d1);
		ll sum2=count_day(y2,m2,d2);
		if(y1==y2)
			cout<<sum2-sum1;
		else{
			ll total_day=(365-sum1)+jiange_day(y1,y2)+sum2;
			cout<<total_day;
		}
	}
	else{
		ll sum1=count_day(y2,m2,d2);
		ll sum2=co...
登录查看完整内容


登录后发布评论

2 条评论
admin
2025年3月19日 12:23

1. count_day 函数存在问题
在 count_day 函数里,for 循环的范围有误。当前代码 for(int i = 0; i < month; i++) 会把当前月份也计算在内,然而实际上我们只需要计算到当前月份的前一个月。

2. 跨年计算时逻辑存在漏洞
在跨年计算时,逻辑处理不够周全,特别是在处理闰年时,没有考虑到不同年份中具体日期的影响。

修正后的代码

#include <bits/stdc++.h>
#define ll long long int
using namespace std;

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

// 计算两个年份之间的天数间隔
ll jiange_day(int y1, int y2) {
    int count = 0;
    for (int i = y1 + 1; i < y2; i++)
        if (isleapyear(i) == 1)
            count++;
    return (y2 - y1 - 1) * 365 + count;
}

// 计算从当年1月1日到指定日期的天数
ll count_day(int year, int month, int day) {
    int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if (isleapyear(year) == 1) months[2] = 29;
    ll sum = 0;
    for (int i = 1; i < month; i++)
        sum += months[i];
    sum += day;
    return sum;
}

int main() {
    string s;
    getline(cin, s);
    int y2 = stoi(s.substr(0, 4));
    int m2 = stoi(s.substr(4, 2));
    int d2 = stoi(s.substr(6));
    int y1 = 2019, m1 = 2, d1 = 5;

    ll days1 = count_day(y1, m1, d1);
    ll days2 = count_day(y2, m2, d2);

    if (y1 == y2) {
        cout << abs(days2 - days1);
    } else if (y1 < y2) {
        ll total_days = (365 + isleapyear(y1) - days1) + jiange_day(y1, y2) + days2;
        cout << total_days;
    } else {
        ll total_days = (365 + isleapyear(y2) - days2) + jiange_day(y2, y1) + days1;
        cout << total_days;
    }

    return 0;
}

 

赞(1)
zhangyuge
2025年3月19日 12:04

有佬可以帮我看看哪错了吗

 

赞(0)