前言
时光飞逝,转眼已经大学毕业三年,看见年轻人不免感叹自己也不再青春,有时候会在想当初自己再努力一点会不会比当下的结果更好?人是成长了 只是追忆往事 意难平,如果当初自己不是那样 现在又怎会觉得时间可贵 机会难得?应活在当下 珍惜每次机会。
粤港澳青少年信息学创新大赛官网:点击跳转到 https://yiic.gdcomf.com/,可以查看赛事信息,2024年05月18日有如下赛项可以报名:创意程序开发闯关竞赛、3D创意设计、微视频创意设计赛、AICG数字艺术创意设计竞赛、智能无人机创新挑战赛、智能创新挑战赛、智能建模创新挑战赛、数智作品创新赛。
虽然自己不能报名,看到这个比赛还是让我想起以往经历:大学时跟随室友参加蓝桥杯、考研备战时刷算法题,以往都是用C语言以面向过程的思想刷题,如今比赛只有C++、GoC、Python 这些面向对象的编程语言可选,倒是激起了我的学习兴趣,看看面向对象和面向过程在处理算法的时候有啥不同?
问题描述
知识点:进制转换 体验题库 Python体验 难度值:3 尝试: 25 AC:2 上传者:
问题描述
比较十进制数的大小太简单了,永远同学想让你回答一个更加复杂的问题:给定 x 进制非负整数 a 和 y 进制非负整数 b,比较它们的大小关系。
输入描述
本题每个测试点有多组数据。
第一行一个正整数 T,表示数据组数。
接下来 T 行,每行四个整数 x,a,y,b,用空格隔开。
输出描述
每组数据输出一行。
如果a<b,输出<;
如果a=b,输出=;
否则输出>。
样例输入1
3
10 996 10 669
2 10101 8 25
12 AB 11 A00
样例输出1
>
=
<
数据范围与提示
1≤T≤10,2≤x,y≤36。
在十进制表示下,0≤a,b<109。
特别说明:对于x,y≥11 的情况,9 之后的数码依次用大写字母A,B,C,⋯Z 表示。
做题思路、解决过程
输入、输出的代码思路
通过读题可以得知:
本程序至少有 5 个变量:t(比较次数,也跟输出有关)、x(变量 a 的进制)、a(变量 a 的数值)、y(变量 b 的进制)、b(变量 b 的数值)
1.输入数据可以分为两部分:第一部分是需要比较大小的次数(对应输入描述:第一行一个正整数 T,表示数据组数);第二部分为 x 进制数 a 和 y 进制数 b(如样例输入最后一行:12进制的 AB 和 11进制的 A00)。
2.输出部分固定为:“ > ”、 “ < ”、 “ = ”,三个符号其中一个,输出多少行与输入的正整数 T 有关。
确定了以上两点,写代码时就要按着输入输出这两点要求去写。
首先,第 1 点(输入)的第一部分:定义一个变量 t ,t 的值从键盘获取:
t = int(input())
然后,第 1 点(输入)的第二部分:根据变量 t 的值获取 t 行数据,每行数据有4个值。
第一时间我就想到 C语言里使用动态内存函数 malloc()
和二维数组,然后开始上网找 python 里二维数组的创建。结果发现 python 里只有 列表、元组、字典,怎么看都和二维数组没关系,后来找到可以使用 import numpy
创建二维数组,我转念一想要是在提交代码框那里使用 import 会不会报错无法运行(后面测试了确实会报错)。然后我又尝试其他方法。
python 里从键盘获取变量值的方法(函数)是 input()
,于是我想用列表 list
接收每一行的值,再通过下标提取 x、y 进制和对应数值,但是后面发现 list 太长(如题目中3 行 4 个 x, a, y, b,此时 list 长 12)又需要额外的变量获取下标,如果 list 长度为 4,后面获取新的 x, a, y, b 又会覆盖掉 前面已经输入的 x, a, y, b。接着我就想怎么解决覆盖这个问题,能不能输入完第一组 x, a, y, b 后就得出需要输出的结果,把结果存放在一个专门存放结果的 list 里,等所有输入都完成时,结果也完成了,接着再顺序输出结果 list 的每一个元素。就这样在解决输入思路时确定了第 2 点输出部分的思路
第 2 点代码可以抽象为:(列表用法可参考菜鸟教程:Python 列表(List))
# 存放结果的列表 list
list = []
# ... 省略中间输入过程
if a > b: # 这里把“比较的过程”抽象成两个变量比较,实际上 a,b 需要转换成相同进制才能比较
list.append(">")
elif a < b:
list.append("<")
else:
list.append("=")
第 1 点第二部分需要一下子从键盘连续获取 4 个值,在 C语言里可以用 scanf()
,于是我就去找 python 里 input()
的用法,找到 input 多变量接收、多变量输入的用法 参考自:2.4. 方法四:结合使用splite()使用input()函数(多个变量 接收 多变量输入),于是这部分代码为:
x, a, y, b = input().split()
算法部分:不同进制数的比较
输入输出的代码有了,也就是程序的头和尾确定了,那么中间不同进制数之间的比较 这段核心算法的代码应该怎么设计呢?
一开始我想到以前学过二进制、八进制、十进制、十六进制数之间的比较,核心思想是将不同进制转换成相同进制才能比较,这时需要确定最终转换成哪种进制方便比较。由于二进制数之间的比较要看位数、权重,比较时需要按从左到右方向逐位比较大小,比较麻烦,八进制、十六进制的比较也是类似。所以最终决定通过转换成十进制数再比较大小,这时又出现新的问题:如何将其他进制转换成十进制?以前 C语言的做法是把进制数每一位都放进数组里,再乘以对应权重,比如二进制 11001010
转换成十进制为 1 * 27+ 1 * 26 + 0 * 25 + 0 * 24 + 1 * 23 +…,最终转换成十进制的 202
,这时就体现出面向过程和面向对象的区别,C语言需要手写二进制转十进制、八进制转十进制、十六进制转十进制、x进制转十进制这些其他进制转十进制过程的函数,而 python 面向对象则只需要 int()
即可将其他进制数转换成十进制,其用法如下:(参考自菜鸟教程:Python int() 函数)
python 内置函数 int()
描述
int() 函数用于将一个字符串或数字转换为整型。
语法
以下是 int() 方法的语法:
class int(x, base=10)
参数
x -- 字符串或数字。
base -- 进制数,默认十进制。
返回值
返回整型数据。
那么其他进制转成十进制的代码很简单了:
x = int(x) # 由于 int() 第二个参数只能为整数,需要将字符转换成整数
y = int(y)
int(a, x) # x 进制数 a,转换成十进制数
int(b, y)
完整代码
t = int(input())
list = []
for i in range(t):
x, a, y, b = input().split()
x = int(x)
y = int(y)
if int(a,x) > int(b,y):
list.append(">")
elif int(a,x) < int(b,y):
list.append("<")
else:
list.append("=")
for i in range(t):
print(list[i])
评测结果
后记
如果您觉得代码还有改进优化的地方,请您大方点评 我虚心请教
面向过程和面向对象确实有很多不一样的地方,还需要多练,现在很多赛事的题库的语言都是面向对象,趁着现在还有这份精力、干劲,冲一冲!
纸上得来终觉浅,绝知此事要躬行。