蓝桥杯代码问题(日期遍历)

问题描述

对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。
例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。
请提交满足条件的日期的总数量。

题目答案是70910,但是下边是我写的代码,结果运行出来一直是70909,真的快找问题找哭了,帮忙必定关注,感谢


#include 
#include 



int main(int argc, char* argv[])
{


    long long sum = 0;

    int year = 1900, mouth = 1, day = 1;
    while (1)
    {
         if (year / 1000 + year / 100 % 10 + year / 10 % 10 + year % 10 == mouth / 10 + mouth % 10 + day / 10 + day % 10)
        {
         sum++;
         printf("%d %d %d\n", year, mouth, day);
          }
        if (year == 9999 && mouth == 12 && day == 31) break;
        if (mouth == 12 && day == 31)
        {
            mouth = 1;
            day = 1;
            year++;
        }
        if (mouth == 2)
        {
            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
            {
                if (day < 29) day++;
                else
                {
                    mouth++;
                    day = 1;
                }

            }
            else
            {
                if (day < 28) day++;
                else
                {
                    mouth++;
                    day = 1;
                }
            }
        }
        else if (mouth == 4 || mouth == 6 || mouth == 9 || mouth == 11)
        {
            if (day < 30) day++;
            else
            {
                mouth++;
                day = 1;
            }
        }
        else
        {
            if (day < 31) day++;
            else {
                day = 1;
                mouth++;
            }
        }
       

    }
        printf("%lld", sum);
    
}

12月31号做完应直接continue

“Devil组”引证GPT后的撰写:

  • 代码在计算年份、月份和日期的数位数字之和时没有考虑数字大于等于 10 的情况,导致计算结果不正确。例如,当年份为 1901 时,年份的数位数字之和应为 11 而不是 2+1+0+1=4。
  • 为了解决这个问题,可以将计算数位数字之和的部分改为循环相加每个数位上的数字。

以下是修改后的代码

#include <stdio.h>
#include <stdlib.h>

int digitSum(int n) {
    int sum = 0;
    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

int main(int argc, char* argv[]) {
    long long sum = 0;
    int year = 1900, month = 1, day = 1;
    while (1) {
        if (digitSum(year) == digitSum(month) + digitSum(day)) {
            sum++;
            printf("%d-%02d-%02d\n", year, month, day);
        }
        if (year == 9999 && month == 12 && day == 31) {
            break;
        }
        if (month == 2) {
            if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                if (day < 29) {
                    day++;
                } else {
                    month++;
                    day = 1;
                }
            } else {
                if (day < 28) {
                    day++;
                } else {
                    month++;
                    day = 1;
                }
            }
        } else if (month == 4 || month == 6 || month == 9 || month == 11) {
            if (day < 30) {
                day++;
            } else {
                month++;
                day = 1;
            }
        } else {
            if (day < 31) {
                day++;
            } else {
                month++;
                day = 1;
            }
            if (month > 12) {
                year++;
                month = 1;
            }
        }
    }
    printf("%lld\n", sum);
    return 0;
}


img