(为什么是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;
}
最后
心得:深切感受到了数学基础的重要性,日后要好好学习数学知识。
日常鼓励自己:早努力一天,就能早一天解决问题。