题目作者:陈建海 浙江大学
按照规定,在高速公路上行使的机动车,达到或超出本车道限速的10%则处200元罚款;若达到或超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
输入格式:
输入在一行中给出2个正整数,分别对应车速和限速,其间以空格分隔。
输出格式:
在一行中输出处理意见:若属于正常行驶,则输出“OK”;若应处罚款,则输出“Exceed x%. Ticket 200”;若应吊销驾驶证,则输出“Exceed x%. License Revoked”。其中x是超速的百分比,精确到整数。
输入样例1:
65 60
输出样例1:
OK
输入样例2:
110 100
输出样例2:
Exceed 10%. Ticket 200
输入样例3:
200 120
输出样例3:
Exceed 67%. License Revoked
思路:读入当前时速a和限速b,先算出超速的比率r=1.0*(a-b)/b,然后用if-else语句,分(1)r<0.1;(2)0.1<r && r<0.5;(3)0.5<=r;这三种情况分别输出。
注意:(1)在计算超速比例时,如果a,b都是按int声明并输入的话,计算超速比率r时,一定要给在(a-b)/b前面乘一个1.0,即1.0*(a-b)/b,否则(a-b)/b得到的结果就是a-b整除b的商。
(2)有些同学直接算出%前面的整数R=(a-b)/b*100,然后用R去和10、50比较;这样是不对,原因是,算术运算符/和*是同一优先级,结合顺序是从左往右结合。即先计算(a-b)/b得到一个整数,在计算这个整数乘以100的值。例如输入110 100,你希望计算出的R为10,但实际上R=(a-b)/b*100 = 10/100*100 = 0*100 = 0。这种情况下并不是不能用R去和10、50进行比较,而是应该声明R为浮点数,然后R的计算公式应该是100.0*(a-b)/b。
(3)虽然题目上说输入为整数,但是也可以把它们直接转换成浮点数输入。计算的时候就不用考虑此时的/是不是整除了。
(4)输出时使用%.0f%%,即这里的精确到整数,是指四舍五入精确到整数,而不是直接取整;还有就是要打印出%,需要再printf语句的双引号内连敲两个%,即%%。
代码1:
#include <stdio.h>
int main () {
int a,b;
double r;
scanf("%d%d", &a, &b);
r = 1.0*(a-b)/b;
if (r < 0.1) printf("OK");
else if (0.1 <= r && r < 0.5) printf("Exceed %.0f%%. Ticket 200", r*100);
else printf("Exceed %.0f%%. License Revoked", r*100);
return 0;
}
代码2:
#include <stdio.h>
int main () {
int a,b;
float R;
scanf("%d%d", &a, &b);
R = 100.0*(a-b)/b;
if (R < 10) printf("OK");
else if (10 <= R && R < 50) printf("Exceed %.0f%%. Ticket 200", R);
else printf("Exceed %.0f%%. License Revoked", R);
return 0;
}
代码3:
#include <stdio.h>
int main () {
float a,b,R;
scanf("%f%f", &a, &b);
R = (a-b)/b*100;
if (R < 10) printf("OK");
else if (10 <= R && R < 50) printf("Exceed %.0f%%. Ticket 200", R);
else printf("Exceed %.0f%%. License Revoked", R);
return 0;
}