【CODEMATE】比较 粤港澳信息学创新大赛 Python赛项 小学组、初中组CMP0008:比较/高中组/体验题库CMEP45:比较/编号P03850/任意进制数之间比较/任意进制转换

前言

  时光飞逝,转眼已经大学毕业三年,看见年轻人不免感叹自己也不再青春,有时候会在想当初自己再努力一点会不会比当下的结果更好?人是成长了 只是追忆往事 意难平,如果当初自己不是那样 现在又怎会觉得时间可贵 机会难得?应活在当下 珍惜每次机会。

  粤港澳青少年信息学创新大赛官网:点击跳转到 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])

  
  

评测结果

评测结果


  
  

后记

  如果您觉得代码还有改进优化的地方,请您大方点评 我虚心请教

  面向过程和面向对象确实有很多不一样的地方,还需要多练,现在很多赛事的题库的语言都是面向对象,趁着现在还有这份精力、干劲,冲一冲!

  纸上得来终觉浅,绝知此事要躬行。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值