编程算法案例1
作者:championsky | 发布时间:
抓交通肇事犯
1.问题描述
一辆卡车违反交通规则,撞人后逃跑。现场有三人目击该事件,但都没有记住车号,只记下了车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:4位的车号刚好是一个整数的平方。请根据以上线索求出车号。
2.问题分析
- 将所有可能的4位整数进行筛选,保留前两位相同、后两位不同的数;
- 对剩下的数,逐个进行平方根计算并判断是否为整数;
- 如果是整数,说明该数是一个符合条件的车号。
3.算法设计:
当卡车车牌号码是一个4位整数时,根据3个目击者的描述,可以具体实现以下算法:
-
- 循环遍历所有的4位数,从1000到9999;
- 对于每个4位数,将它的千、百、十、个位分别计算出来。
- 根据甲、乙两位目击者的描述,筛选出可能的车牌号码:
- 对于满足条件的车牌号码,利用数学库中的平方根函数求出平方根,并判断平方根是否是整数。
- 输出符合条件的车牌号码。
Python语言实现
import math
for num in range(1000, 10000):
a = num // 1000 # 取千位
b = num // 100 % 10 # 取百位
c = num // 10 % 10 # 取十位
d = num % 10 # 取个位
if a == b and c != d: # 满足甲说的条件
if c == d and a != c: # 满足乙说的条件
square = int(math.sqrt(num)) # 计算平方根,转换为整数
if square * square == num: # 满足丙说的条件
print('车号是:', num)
代码中使用range函数对所有可能的4位整数进行遍历,然后根据题目所给的三个线索依次进行筛选,最后得到符合条件的车号。
执行结果为:
车号是: 7744
故该卡车的车牌号码是7744。
C语言实现
#include <stdio.h>
#include <math.h>
int main() {
int a, b, c, d, num, square;
for (num = 1000; num < 10000; num++) {
a = num / 1000; // 取千位
b = num / 100 % 10; // 取百位
c = num / 10 % 10; // 取十位
d = num % 10; // 取个位
if (a == b && c != d) { // 满足甲说的条件
if (c == d && a != c) { // 满足乙说的条件
square = sqrt(num);
if (square * square == num) { // 满足丙说的条件
printf("车号是:%d\n", num);
}
}
}
}
return 0;
}
这段 C 代码与 Python 版本类似,区别在于:
- C中
sqrt函数存在于math.h头文件中。 - C中判断整数的方式与Python中略微不同。C语言中直接用
sqrt(num) * sqrt(num) == num进行判断,Python中使用int(sqrt(num))**2 == num。当然,由于C语言的运行速度比Python更快,对于这个数字计算的速度更快些。
执行结果:
车号是:7744
JAVA语言实现
public class Main {
public static void main(String[] args) {
int a, b, c, d, num, square;
for (num = 1000; num < 10000; num++) {
a = num / 1000; // 取千位
b = num / 100 % 10; // 取百位
c = num / 10 % 10; // 取十位
d = num % 10; // 取个位
if (a == b && c != d) { // 满足甲说的条件
if (c == d && a != c) { // 满足乙说的条件
square = (int) Math.sqrt(num);
if (square * square == num) { // 满足丙说的条件
System.out.println("车号是:" + num);
}
}
}
}
}
}
与前面两个版本类似,这个版本的 Java 代码实现了完全相同的算法。唯一的区别就是使用了 Java 语言的语法和库函数。与 C 语言不同的是,在 Java 中我们需要显式地将 Math.sqrt 的返回值转换为整数,否则将显示一个编译器错误。
执行结果:
车号是:7744