P5707 【深基2.例12】上学迟到

题目描述
yyy 的学校要求早上 8 点前到达。学校到 yyy 的家一共有 s(s≤10000) 米,而 yyy 可以以 v(v<10000) 米每分钟的速度匀速走到学校。此外在上学路上它还要额外花 10 分钟时间进行垃圾分类。请问为了避免迟到 yyy 最晚什么时候出门?输出 HH:MM 的时间格式,不足两位时补零。由于路途遥远, yyy 可能不得不提前一天出发,不过不可能提前超过一天。

输入格式
两个正整数 s,v,意思已经在题目中给定。

输出格式
hh:mm 表示最晚离开家的时间(时:分,必须输出两位,不足两位前面补0)

输入输出样例
输入

100 99

输出

07:48

题解
第一次错误解!!
第一次提交,过了三个点,回来仔细读题。发现可能会提前一天,但不会提前超过一天,同时也没有考虑到1.5分钟和1.5小时这种带小数位的时间,没有加一位。

**错解:**
import java.util.Scanner;
public class P5707深基212上学迟到 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int s=in.nextInt();
		int v=in.nextInt();
		int t=s/v;
		if (s<=v) t=1;
		else t++;
		int h=t/60;
		if (h<=60) h=1;
		else h++;
		System.out.printf("%02d%c%02d",8-h,':',60-t-10);
	}
}

在这里插入图片描述
第二次错误解!!

import java.util.Scanner;
public class P5707深基212上学迟到 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int s=in.nextInt();
		int v=in.nextInt();
		int t=s/v;		//一共需要花多少分钟
		int t1=s%v;		//判断是否为整数
		if (s<v) t=1;	//如果距离还没有一分钟规定的多,那么就直接算成一分钟,
		else if (s>v&&t1!=0) t++;		//如果是不整数倍,在原来倍数上加1分钟(如1.5分钟)
		int h=t/60;		//计算一共需要多少个小时
		int h1=t%60;	//判断是否为整数
		if (h<1) h=1;	//如果少于等于一个小时,算作一个小时
		else if (h>1&&h1!=0) h++;	//如果不为整数,要多加一个小时
		t=t%60;		//取%出来的分钟做最后的减法
		if (h<8) {
			System.out.printf("%02d%c%02d",8-h,':',60-t-10);
		}
		else System.out.printf("%02d%c%02d",(8-h)+24,':',60-t-10);
	}
}

在这里插入图片描述

一直有两个点过不去,希望有大佬能告诉我哪里逻辑不够严谨,请指正。

正解(吸收了其他大佬的解法)

import java.util.Scanner;
public class P5707深基212上学迟到 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int s=in.nextInt();
		int v=in.nextInt();
		int time=(int)Math.ceil(s*1.0/v)+10;	//ceil()向上取整
		if(time<=480){		//在当天
			time=480-time;
			System.out.printf("%02d:%02d",time/60,time%60);
		}
		else{		//在前一天
			time=(8+24)*60-time;
			System.out.printf("%02d:%02d",time/60,time%60);
		}	
	}
}

总结
以上用到的几个知识点:
1.在进行一些数据处理的时候,经常需要对结果进行向上或向下的取整操作,Java有专门的方法支持:

向上取整用Math.ceil(double a)

向下取整用Math.floor(double a)

例如:

  double a=30;
  double b=20;
  double c = a/b;
  System.out.println(c);   //1.5
  System.out.println(Math.ceil(c)); //2.0
  System.out.println(Math.floor(c));  //1.0
  1. printf()函数和format()函数补0
public class Main{      
  public static void main(String[] args) {      
    int n=2;     
    // 0 代表前面补充0      
    // 2 代表长度为2      
    // d 代表参数为正数型      
    String str = String.format("%02d", n); 
    System.out.printf("%02d",n);//02     
    System.out.println(str); // 02    
  }      
} 
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值