初学C语言之近日小结7

(为什么是7而不是6?因为之前电脑坏了,上次打卡用的是手机写的PPT,所以第六次的就在日后转写成博客)
近日一直在做题
从昨天电脑修好之后就一直在PTA做题,做的题中有简单的也有难的让人头疼的,今天在这里就举出两个:
时间流逝问题
下面是题目:
然后是几点(15 分)

有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。

输入格式:

输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。

输出格式:

输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。

输入样例:

1120 110
输出样例:

1310

我对于这道题的基本思路是:先把流失时间(单位:分钟)全部加入分钟内,然后分两大种情况判断(分正负),之后判断流失时间是否超过一小时,然后再做处理。
下面是代码:

#include<stdio.h>

int main()
{
    int time;           //读入的第一个整数 
    int hour;       //分解time之后的小时 
    int minute1;    //分解time之后的分钟 
    int minute2;    //消耗时间,单位:分钟                                                                 

    scanf("%d %d", &time, &minute2);    //读入两个整数 

    hour = time / 100;                  //从time分解出hour 
    minute1 = time % 100;               //从time分解出minute1 

    //判断消耗时间是否需要递进几小时 
    if(minute1 + minute2 < 60){         
        minute1 += minute2;                     //minute1==0时不需要做任何运算 
        if(minute1 < 0){                        //此为递减情况 
            minute1 = 0 - minute1;              //将minute1转化为正数,方便计算 
            hour = hour - 1 - minute1 / 60;     //
            minute1 = 60 - minute1 % 60;    
        }
    } else if(minute1 + minute2 == 60){ //此为正好需要递进一小时的情况 
        hour++;                         //hour++
        minute1 = 0;                    //分钟归为零 
    }else if(minute1 + minute2 > 60){   //此为需要递进小时且分钟也要做处理的情况 
        minute1 += minute2;             //先把消耗时间全部加入分钟内 
        hour = hour + minute1 / 60;     //所需递进的小时数为分钟除以100的结果 
        minute1 = minute1 % 60;         //最后的分钟为除余100的结果 
    }
    //由于起始时间和终止时间在同一天,所以不用判断hour超过24的情况 

    int time2;                          //time2是最后得到的时间 
    time2 = hour * 100 + minute1;
    printf("%d", time2);
    return 0;
}

另外:也可以把流失时间根据原来的分钟转化为小时分钟的形式,不过个人感觉麻烦些。

让人心累的兔子数列
这是题目:
兔子繁衍问题(15 分)

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:

输入在一行中给出一个不超过10000的正整数N。

输出格式:

在一行中输出兔子总数达到N最少需要的月数。

输入样例:

30
输出样例:

9

素来题目字数越少的题越难,这道题就很好的证明了这句话。具体思路写在了代码里:

#include<stdio.h>
/*此题用到了 斐波那契数列
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,
 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........
这个数列从第3项开始,每一项都等于前两项之和
*/
int main()
{
    int N;                              //N为输入的兔子数量 
    int month;                          //month为生出相应兔子的所需的最少月份数量 
    int rabbit[100];                    //此为存放每月兔子数量的数组 
    int n;                              //n为数组单元数 

    rabbit[0]=1;
    rabbit[1]=1;                        //将特殊的前两个数组单元初始化 

    for(n=2;n<100;n++){                 //用来计算并储存每个数组单元 
        rabbit[n] = rabbit[n-1] + rabbit[n-2];
    }

    scanf("%d", &N);                    //读入兔子数量 

    if(N>0 && N<=10000){                //确定N的范围 
        if(N==1){                       
            month=1;                    //特殊情况: 因为兔子数为1时,1个月是最短时间 
            printf("%d",month);         //因为情况不一样,所以分开输出month 
        }else if(N>=2){                 //此为有规律情况 
            for(month=2;(N>rabbit[month] && rabbit[month]>rabbit[month-1]);month++);        //因为输入的数不可能正好是数组对应的数,所以判断条件是一个范围 
            printf("%d",month+1);                           //输出,因为数组是从0开始,所以在月份上要加上1 
        }
    }
    return 0;
}

最后
心得:深切感受到了数学基础的重要性,日后要好好学习数学知识。
日常鼓励自己:早努力一天,就能早一天解决问题。

猜你喜欢

转载自blog.csdn.net/Yao_orange/article/details/82222061
今日推荐