上学迟到问题(c语言初阶)

不少初学者被上学迟到的问题劝退,但实际上只要运用一定思想便可以破解此类问题

问题如上,要给定一个输出时间,如果按照正常的思路走就是给出如下代码,通过减法来得到时间

#include<stdio.h>
int main()
{
	int s, v, time, hour = 0,min=0;
	scanf("%d %d", &s, &v);
	if (s >= v)//路程比速度大,用不只一分钟
	{
		if (s % v != 0)
			time = s / v + 11;//加上不足的一分钟和分类的10分钟
		else
			time = s / v + 10;
		//恰好路程比速度是整数(共计多少分钟)
		hour = time / 60;//算出有多少小时
		min = time - hour * 60;//算出除小时外的分钟多长//速度比路程大
	}
	else//速度比路程大
	{
		min = 11;
		hour = 1;
	}
	if(hour==0)//不足一小时因为07:XX
	{
		hour = 1;
	printf("%02d:%02d", 8 - hour, 60 - min); 
	}
	else if (time % 60 != 0 && hour != 0)//1小时多的时间还有分钟
		{
		hour = hour + 1;
			printf("%02d:%02d", 8 - hour, 60 - min);
		}
	else//小时为整数
		printf("%02d:%02d", 8 - hour, min);
	return 0;
}

但是只能的到改题目的一部分分数,为什么呢

理由如下:

如果是上大学出省,坐火车的同学可能就会超过8个小时就可能到提前一天,但是如果超过8小时,那么该代码所得数就为负 

如果再按照这种方式计算,代码量惊人!!!

所以我们选择一种全新的思想,也就是这个题目的核心思想,将时间转换为分钟,因为时间是60进制采用分钟的形式用除法和取余便可以效果惊人

#include<stdio.h>

int main()
{
	int s,v,hour, min, time=8*60;//计算24:00时间问题,优先考虑将时间转换为分钟计算
	scanf("%d %d", &s, &v);
	if (s / v <= 8 * 60 - 10)
	{
		hour = (time - 10 - s / v) / 60;
		if(s%v!=0)
		min = (time - 10 - s / v) % 60-1;//不足一分钟按一分钟计算
		else
		min = (time - 10 - s / v) % 60;
		printf("%02d:%02d", hour, min);//占位符%+数字表示占几个字符%02d表示00型,占位符%2可以是12也可以是 1(空1)
		           //若浮点数即float类型则为%.2f表示两位小数   “  .f ”有一个小点,表示几位小数
	}
	else
	{
		time = 24 * 60;//超过一天按照重新1440分钟计算,可以考虑加上一个新定义day
		hour= (time - 10 - (s / v-8*60)) / 60;
		if (s % v != 0)
		min = (time - 10 - (s / v-8*60)) % 60 - 1;//(s/v-8*60)扣除第一天的8小时
		else
		min = (time - 10 - (s / v-8*60)) % 60;
		printf("%02d:%02d", hour, min);
	}


	return 0;
}

通过转换为分钟的方式我们可以轻松的解决24小时计算时间的问题,同时过去一天的问题也同样得得到了解决

60进制等进制的应用

即先转化为最小单位,再通过除法和取模

就可以轻松解决数据进位的问题

如果你有收获或者帮助你解决了问题,那就留下一个免费的赞吧

如果有不对的地方也随时欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值