处理没有提示的字符串、计算相隔天数应用题

正常情况下,小云每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小云要跑 2 千米。如果同时是周一或月初,小云也是跑 2 千米。

小云跑步已经坚持了很长时间,从 1990 年 1 月 1 日周一(含)到 2022 年 2 月 20 日周日(含)。请问某一天小云总共跑步多少千米?

输入格式:

有多组数据,每行为三个正整数,且不超过小云跑步日期的范围。

输出格式:

对每一组输入,在一行中输出小云总共跑步多少千米。

输入样例:

2020 1 1
1990 5 1

输出样例:

12833
143

        代码长度限制         16 KB                                         时间限制                 400 ms

        内存限制                 64 MB                                        栈限制                     8192 KB

 思路:

1、从字符串中提取年月日

2、计算有多少天

3、加上周一的数量和包含月的数量

4、减去既是周一又是月初

#include
#include 
//codeblocks 需要嗯两次ctrl+z才能结束??
int main()
{
    int year,month,day;
    int n=1;
    char input[100];
    int i=0;
    for (;scanf("%c",&input[i])!=EOF;i++)
    {
        if (input[i]=='\n')
            n++;
    }
    input[i]='\0';//!!!!!与下面
    i=0;
    int y,x,y0;
    while (n--)
    {
//从字符串中提取年月日
        year = (input[i++]-'0')*1000 + (input[i++] -'0')*100 + (input[i++] - '0')*10 + input[i++]-'0';
        i++;
        if (input[i+1]!=' ')
            month = (input[i++] - '0')*10 + input[i]-'0';
        else
            month = input[i]-'0';
        i+=2;
        //判断日期有几位
       if ( input[i+1]!='\0' && input[i+1]!='\n')//上面结尾必须加'\0' 不同的编译器不同的结果 加上i+1='0' && input[i+1]<='9')gcc不加\0使用strlen得到的结果比实际商 clang与实际长度相同但是答案也有不对的
        {//printf("a%daa%ca%daa\n",i,input[16],strlen(input));例题中没有这种情况
            day = (input[i++] - '0')*10 + input[i]-'0';
        }
        else
            day = input[i]-'0';
        i+=2;
//计算有多少天
        y = year - 1990 ;    //不用减1
        y0 = y;              //记录有多少完整的年 用于后面计算有多少个月初
        x=0;                 //完整的年中闰年的个数
        if (y>2)
            x = (y-3)/4 + 1;       //!!!1992结果为1 2020结果为7 从1990年到1992为第一个闰年 从93年开始每4年一个闰年 所以减3而不是减2
        y = y * 365 + x;    //完整的年中的天数
        if (year==1990)
        {
            y=0;
            y0=0;
        }
        if (year %4 == 0 && year%100 != 0  || year%400 == 0)//闰年额外加1
        {
            if (month > 2 || month ==2 && day ==29)
                y++;
        }
        for(year=1;yearday)    //!!!!不判断会超范围
                break;
            if (today%7==1)
                y--;
            if (month==12)    //新的一年更新月
            {
                month = 1;
                year ++;
            }
            else
                month++;
        }
        printf("%d\n",y);
    }
}

你可能感兴趣的:(算法,c语言)