蓝桥与力扣刷题(蓝桥 购物单)
题目:小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。
这不,大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。
小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。
现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。
取款机只能提供 100元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。
以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。
需要说明的是,8888 折指的是按标价的 8888 计算,而 88 折是按 8080 计算,余者类推。 特别地,半价是按 5050 计算。
请输出小明要从取款机上提取的金额,单位是元。
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
解题思路+代码:(引用题解区 作者:张三xy)
代码:
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class 购物单{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=50;
double sum=0;
while (n>0){
String d=sc.next();
double p=sc.nextDouble();
String zk=sc.next();
sum +=spend(p,zk);
n--;
}
System.out.println((int)Math.ceil(sum/100)*100);
}
static double spend(double p,String zk){
return p*zheKo(zk);
}
//计算折扣
static double zheKo(String zk){
int t=100;
double z=0;
if (zk.length()==2)t=10;
if (zk.equals("半价"))z=0.5;
else {
String s=zk.substring(0,zk.length()-1);
z=Integer.parseInt(s)*1.0/t;
}
return z;
}
}
解题思路:(Excel表)将题目中的数据复制粘贴在Excel表中,折扣中“折”替换成“ ”,“半价”替换成50,像9,8,7,6,5折的手动加0,再对折扣一列的单元格使用=J1/100(折扣的结果存放在K列),算出折扣后进一步乘以原价(=I1*K1)等于折扣价(折扣价存放在L列)。最后利用求和函数=SUM(L1:L50)算出购物的价格。
总结: 这道题的难度属于很难的了,第一个难点就是数据非常地冗长,检测时间也需要花费很久,根据上面的图也能看出逻辑正确的代码在提交时也会超时;第二个难点就是计算,在题解区看到很多人使用暴力计算,想要算出商品的价格(在考试当中也是没办法的办法了),但是这样输入一个错误的商品价格就会导致结果错误。另一个方法就是使用Excel表将题目中的数据导入进去计算,详细步骤已经在上面有相应的解释。(附:如果有更好的思路可以分享在评论区,谢谢~)