题目描述
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深基2例12上学迟到 {
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深基2例12上学迟到 {
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深基2例12上学迟到 {
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
- 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
}
}