qqcmm1015 2023-05-13 23:31 采纳率: 61.8%
浏览 28

c语言18岁生日计算

Description

小明的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所以他想请你帮忙计算一下他和他的几个朋友从出生到达18岁生日所经过的总天数,让他好来比较一下。
Input

输入的第一行是一个数T,后面T行每行有一个日期,如我的生日是1988-03-07。

Output

T行,每行一个数,表示此人从出生到18岁生日所经过的天数。如果这个人没有18岁生日,就输出-1。
Sample Input

1
1988-03-07
Sample Output

6574

#include<stdio.h>
int run(int year);
int main()
{
    int year,month,day,i,j,sum,t,k;
    int a[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
    };
    scanf("%d",&t);
    while(t)
    {
        sum=0;
        scanf("%d-%d-%d",&year,&month,&day);
        k=month;
        if(run(year+18)==0&&month==2&&day==29)
        {
            sum=-1;
        }
        else
        {
            sum=sum+a[run(year)][month]-day;
            for(i=year;i<year+18;i++)
            {
                for(j=month+1;j<=12;j++)
                {
                    sum+=a[run(i)][j];
                }
                month=0;
            }
            for(i=1;i<=k-1;i++)
            {
                sum+=a[run(year+18)][i];
            }
            sum+=day;
        }
        printf("%d\n",sum);
        t--;
    }
}
int run(int year)
{
    int ret;
    if(year%4==0||(year%400==0&&year%100!=0))
    {
        ret=1;
    }
    else
    {
        ret=0;
    }
    return ret;
}


以上代码测试为通过,请问哪里出错了

  • 写回答

1条回答 默认 最新

  • 红色荷包蛋 2023-05-14 00:11
    关注

    码字不易,有用望采纳答案参考Chatgpt解答
    在您提供的代码中,逻辑上没有明显的错误。然而,存在一个潜在的问题,可能导致结果不正确。

    问题在于,在计算每个人从出生到18岁生日的天数时,您在两个循环中都使用了变量month。这会导致内层循环(for(j=month+1;j<=12;j++))中的month始终为外层循环中的初始值,而不会更新为1。这会导致计算出的天数不准确。

    为了修复这个问题,您可以使用不同的变量来迭代月份,而不是重复使用month变量。例如,您可以在循环之前声明一个新的变量m,并将其初始化为month的值。然后,在内层循环中使用m来迭代月份。

    下面是修改后的代码:

    #include <stdio.h>
    
    int run(int year);
    
    int main()
    {
        int year, month, day, i, j, sum, t, k;
        int a[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}
        };
    
        scanf("%d", &t);
    
        while (t)
        {
            sum = 0;
            scanf("%d-%d-%d", &year, &month, &day);
            k = month;
    
            if (run(year + 18) == 0 && month == 2 && day == 29)
            {
                sum = -1;
            }
            else
            {
                sum = sum + a[run(year)][month] - day;
    
                for (i = year; i < year + 18; i++)
                {
                    for (j = month + 1; j <= 12; j++)
                    {
                        sum += a[run(i)][j];
                    }
                    month = 0;
                }
    
                for (i = 1; i <= k - 1; i++)
                {
                    sum += a[run(year + 18)][i];
                }
    
                sum += day;
            }
    
            printf("%d\n", sum);
            t--;
        }
    }
    
    int run(int year)
    {
        if (year % 4 == 0 && (year % 400 == 0 || year % 100 != 0))
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
    

    请尝试使用这个修改后的代码运行,看看结果是否正确。如果仍然存在问题,请提供更多的错误信息和输入示例,以便我能够更好地帮助您。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月13日

悬赏问题

  • ¥15 kotlin multiplaform 的共享模块支持蓝牙吗还是说安卓和ios的蓝牙都要自己配
  • ¥15 为什么我的查询总是显示无数据,该怎么修改呢(语言-java)
  • ¥15 IDDPM采样结果异常
  • ¥100 求一个,王者荣耀查询隐藏战绩的教材,爬虫代码
  • ¥60 Cocos creator缓动问题
  • ¥15 专业问题提问,7月5号2点之前
  • ¥25 使用cube ai 导入onnx模型时报错
  • ¥15 关于#微信小程序#的问题:用一个网页显示所有关联的微信小程序数据,包括每个小程序的用户访问量
  • ¥15 root的安卓12系统上,如何使apk获得root或者高级别的系统权限?
  • ¥20 关于#matlab#的问题:如果用MATLAB函数delayseq可以对分数延时,但是延时后波形较原波形有幅度上的改变