题目说明
铺地砖(京东2016实习生真题)
小东最近承接了一个工程,为一块广场铺设地砖。待铺设的广场是矩形的,大小为N*M平米,业主要求铺设的地砖规格统一,大小为a*a平米。地砖可以超出待铺设的区域,但必须将指定的区域完全覆盖。铺设时,要求地砖边缘需与指定区域边缘平行,且必须用整块的地砖铺设,不允许将地砖破碎铺设。
小东最近承接了一个工程,为一块广场铺设地砖。待铺设的广场是矩形的,大小为N*M平米,业主要求铺设的地砖规格统一,大小为a*a平米。地砖可以超出待铺设的区域,但必须将指定的区域完全覆盖。铺设时,要求地砖边缘需与指定区域边缘平行,且必须用整块的地砖铺设,不允许将地砖破碎铺设。
为节约成本,小东需要知道铺设最少需要多少地砖。请你帮忙计算她最少需要采购的地砖数。
题目分析
输入的数据可以分为两种情况,M>=a&&N>=a(1) 或者 M<a||N<a(2)
之后(1)可分为四种情况 ,M%a==0&&N%a==0和另外三种情况。详见代码分析
(2)可以分为三种情况,M<a&&N<a和另外两种情况。详见代码分析
相关代码
注意事项
(1) 注意a<10^9,所以最终的输出结果要为double类型的数据。但输入数据均可使用int类型的数据进行接受。
(2)double类型的数据要想确定输出模式,要使用 DecimalFormat这个库函数。
DecimalFormat dFormat=new DecimalFormat("##.##");
System.out.println(dFormat.format(number));
DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置,但不会用0填充。主要作用于小数位的操作。
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
DecimalFormat dFormat=new DecimalFormat("##.##");//确保以整数的形式进行输出。
int count=Integer.parseInt(in.nextLine());
ArrayList<String> list=new ArrayList<String>();
String line=null;
for (int i = 0; i < count; i++) {
line=in.nextLine();
list.add(line);
}
int num[]=new int[3];
int n1=0,n2=0;//n1,n2为M/a和N/a;
double number=0;
String numString[];
for (int i = 0; i < list.size(); i++) {
line=list.get(i);
numString=line.split(" ");
for (int j = 0; j < 3; j++) {
num[j]=Integer.parseInt(numString[j]);
}
if (num[0]>=num[2]&&num[1]>=num[2]) {//第(1)种情况
if (num[0]%num[2]==0&&num[1]%num[2]==0) {
number=((double)num[0]/num[2])*((double)num[1]/num[2]);
}
else if(num[0]%num[2]==0&&num[1]%num[2]!=0){//其中有一边不能整除, 结果(n1+1)*n2或者(n2+1)*n1
number=(Math.ceil(num[1]*1.0/num[2]))*(num[0]/num[2]);//有与整数相处不会有小数,所以要将整数型变为double型(*1.0)
}
else if(num[0]%num[2]!=0&&num[1]%num[2]==0){//其中有一边不能整除
number=Math.ceil(num[0]*1.0/num[2])*(num[1]/num[2]);
}
else {//l两边都不能整除, 结果(n1+1)*(n2+1)
n1=num[0]/num[2];
n2=num[1]/num[2];
number=(double)n1*(double)n2+n1+n2+1;
}
}
else {//第(2)种情况
if (num[0]<num[2]&&num[1]<num[2]) { //M<a&&N<a
number=1;
}
else if(num[0]<num[2]&&num[1]>=num[2]){ //一条边比a小,结果为大的边/a
number= Math.ceil(num[1]*1.0/num[2]);
}
else if (num[1]<num[2]&&num[0]>=num[2]) {//一条边比a小,结果为大的边/a
number=Math.ceil(num[0]*1.0/num[2]);
}
}
System.out.println(dFormat.format(number));
}
}
}
DecimalFormat库函数的使用
实例如下
DecimalFormat dFormat=new DecimalFormat("##.##");
DecimalFormat dFormat2=new DecimalFormat("000.000");
System.out.println(dFormat.format(1333)); //#对整数位影响比较小,当整数位数超出定义位数会正常显示
System.out.println(dFormat.format(1333.0));//#不能代表0,所以此处可以将double类型的数据已int形式输出
System.out.println(dFormat.format(1333.234567));//#对小数位影响比较大,当整数位数超出定义位数会进行舍入
System.out.println(dFormat.format(3.234567));//当整数位数少于定义位数不会填充
System.out.println();
System.out.println(dFormat2.format(1333)); //小数位不够时会进行填充
System.out.println(dFormat2.format(1333.0));
System.out.println(dFormat2.format(1333.234567));//小数位超出时同#
System.out.println(dFormat2.format(3.234567));//整数位不够时会填充0
1333
1333
1333.23
3.23
1333.000
1333.000
1333.235
003.235