https://pintia.cn/problem-sets/12/problems/278
习题3-2 高速公路超速处罚(15 分)
按照规定,在高速公路上行使的机动车,达到或超出本车道限速的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
我的初版代码,大概是这样的:
#include
void rule(int speed, int limit);
int main()
{
int speed, limit;
if(scanf("%d %d", &speed, &limit) == 2)
{
rule(speed, limit);
}
return 0;
}
void rule(int speed, int limit)
{
if( speed>=0 && speed*1.10)
{
printf("OK\n");
}
else if(speed*100>=limit*110 && speed*1.50)
{
printf("Exceed %d%%. Ticket 200\n", (int)(100.00*(speed-limit)/limit));
}
else if(speed>=limit*1.50)
{
printf("Exceed %d%%. License Revoked\n", (int)(100.00*(speed-limit)/limit));
}
}
报错:
测试点 提示 结果 耗时 内存
0 sample 1等价,正常 答案正确 2 ms 128KB
1 sample 2等价,罚款 答案错误 2 ms 256KB
2 sample 3等价,吊销驾照 答案正确 2 ms 128KB
即这个用例:
输入样例2:
110 100
输出样例2:
Exceed 10%. Ticket 200
拿到本地调试:
$gcc q.c
$./a.out
110 100
OK
显然是if( speed>=0 && speed这一行代码判断出了问题。
我大概明白错误的原因了,应该是limit*1.10这个浮点数在计算机中不能精确地表示,进而导致判断的结果是speed小于limit*1.10。
将这一行修改为speed>=0 && speed*10。
新一版的代码:
#include
void rule(int speed, int limit);
int main()
{
int speed, limit;
if(scanf("%d %d", &speed, &limit) == 2)
{
rule(speed, limit);
}
return 0;
}
void rule(int speed, int limit)
{
if( speed>=0 && speed*10*11)
{
printf("OK\n");
}
else if(speed*100>=limit*110 && speed*1.50)
{
printf("Exceed %d%%. Ticket 200\n", (int)(100.00*(speed-limit)/limit));
}
else if(speed>=limit*1.50)
{
printf("Exceed %d%%. License Revoked\n", (int)(100.00*(speed-limit)/limit));
}
}
本地测试结果:
$gcc q.c
$./a.out
110 100
Exceed 10%. Ticket 200
但是在在线编程平台上,仍然测试不通过,这个原因就不得而知了。算了,暂时跳过这个问题吧。
参考文献:
1. 《C语言程序设计(第3版)》 - 浙江大学;
2. 浙大版《C语言程序设计(第3版)》题目集。