题目简介
困扰了自己两三天的一道题目
BC64牛牛的快递
描述
牛牛正在寄快递,他了解到快递在 1kg 以内的按起步价 20 元计算,超出部分按每 kg 1元计算,不足 1kg 部分按 1kg计算。如果加急的话要额外付五元,请问牛牛总共要支付多少快递费
输入描述:
第一行输入一个单精度浮点数 a 和一个字符 b ,a 表示牛牛要寄的快递的重量,b表示牛牛是否选择加急,‘y’ 表示加急 ,‘n’ 表示不加急。
输出描述:
输出牛牛总共要支付的快递费用
代码块
#include<stdio.h>
int main()
{
int price=0;;//价格
int i=0;//超出的公斤数
float a=0.0;//公斤数
char b=0;//y n
int cnt;
scanf("%f %c",&a,&b);
if(a<=1.0)
{
if(b=='y')
{
price=20+5;
}
else
price=20;
}
else if(a>1)
{
if((a-1.0)!=(int)(a-1.0))
{
i=(int)(a-1.0)+1;
}
else
{
i=a-1.0;
}
if(b=='y')
{
price=20+i+5;
}
else{
price=20+i;
}
}
printf("%d",price);
return 0;
}
解题步骤
前两天做的时候总是在第八组实验样例中报错,于是自己在斤数上加加减减,但也没有起到作用,于是就往后刷题了,没有再管。但是!这就像无数修炼过程中的一个阻碍,如果不突破他,自己也很难有大进步。所以今天就再推倒重来!无非是再来一次!
第一步
首先看题,1kg之内的快递是20元,如果再加急的话就是再加五块钱。不加急,就是20元。这样第一个循环也就能写出来了,先不用管我们变量都用什么类型的,咱们先把主要的框架想出来,再去解决细枝末节的东西。就和雕刻一样,都是先雕一个大概,再去修饰。
第二步
其次,如果快递超出1kg,每1kg都要加一块钱,不足1kg的也按1kg算。
这时候我就在想,如何才能表示不足1kg时,也按1kg算。我想到了强制转换类型,如果是1.5kg,那1kg是基础费用,这0.5就是而外加的,如何表示?
不难看出,int形的强制转换是向下取整,所以我们索性加个1好了,要不然怎么表示小于1时额外的钱。
else if(a>1)
{
if((a-1.0)!=(int)(a-1.0))
{
i=(int)(a-1.0)+1;
}
else
{
i=a-1.0;
}
if(b=='y')
{
price=20+i+5;
}
else{
price=20+i;
}
}
printf("%d",price);
return 0;
这第二步的代码才是最重要的,我一步一步翻译。
else if(a>1) 这是当快递大于1kg时,
如果快递斤数-1.0 不等于强制转换类型后的a-1.0
这个意思就是 快递斤数-1.0 后如果还是小数 那就是几点几的表示形式,这种情况我们需要对它向下取整并加一,但是!如果我们减去1后它就是一个整数怎么办?这也是我遇到的最关键的问题,如果减1后是一个整数,我们再强制转换再加1,那数值就超出预计的数了,多加了一次1。 所以为了解决这个问题,我写了这个if循环。
这个结果是我没有写这个循环时候的报错
其实这道题最关键的就是判断快递的斤数减1后是不是一个小数,如果是小数,就强制转换再加1。如果是整数就 不用再加1了。