CSDN 周赛41期

CSDN 周赛41期

  • 吐槽
  • 考题分享
    • 编程题(共2道)
      • 1、题目名称:数制转换(分值20)
      • 2、题目名称:珠算指令生成器(分值55)
    • 判断题(5分)
    • 单选题 (共2道)(共10分)
    • 填空题(10分)
  • 总结

吐槽

这次csdn的竞赛,有了一个非常大的改动,编程题仅仅有两个,增加了判断题,单选题和填空题,看着更像考试的样子了。

但是,你的考试时间设置为5个小时是个什么鬼?晚上7点进场还好说,至少当天结束了,晚上8点50进场的,你是想让他考到半夜1点之后吗?虽然咱也知道,编程题第二题确实废时间,但那你也不能要求参加这个的人当做正式工作来对待吧?老顾上班都没这么认真的。。。。不对,老顾上班都是认真摸鱼的。

还有啊,咱考试的用例能不能实测一下,虽然老顾暂时排名第一,但如果按照填空题答案是错误的进行修正后,老顾仅仅48分,第11名及之前的都加10分,老顾也就名落孙山了。老顾宁可自己没有名次,也不能出现用例答案错误的现象啊。

考题分享

这次由于编程第二题比较杀时间,所有人都没做完,因为他一个题目就55分了,如果有任何一个人只做完这一个题ac了,也是第一名了。所以这次就不说题解了,咱不配。。。。

编程题(共2道)

1、题目名称:数制转换(分值20)

由于人类长了十根手指,所以人类的计数最常用的数制就是十进制。 但是,计算机中最常用的进制是二进制,因为二进制可以用比较少的物理状态来表示。 可是二进制只有0和1两个数字,很容易写得很长,所以也经常使用八进制或十六进制。
八进制的数使用0到7八个数字来表示,逢八进一。 十六进制的数除了0到9这十个数字以外,还使用A到F这六个字母(A到F分别代表十进制的10到15)一共十六个符号来表示,逢十六进一。
请把输入的数字转换为十进制。 如果数字中只有0和1,那么就认为是二进制。 如果数字中只有0到7,那么就认为是八进制。 如果数字中有不止0到7,那么就认为是十六进制。 如果出现了0到9、A到F(不区分大小写)之外的字母,那么就请输出“NaN”

这个题目是送分的,没什么可说的,大部分语言都支持直接进行进制转换,老顾这里用的是python,用集合减法一算就知道该怎么转了,然后用 int 带进制。。。很简单。这个题唯一需要注意的就是,不管输入什么,都不能当做10进制输出。

a = input().lower()
if len(set(a) - set('0123456789abcdef')) > 0:
	print('NaN')
else:
	if len(set('89abcdef') & set(a)) > 0:
		print(int(a,16))
	elif len(set(a) - set('01')) == 0:
		print(int(a,2))
	elif len(set(a) - set('01234567')) == 0:
		print(int(a,8))
	else:   # 其实运行不到 else 里的内容
		print(a)

2、题目名称:珠算指令生成器(分值55)

现代人做两个数的加减法运算,是非常简单的事情:只要在计算器上按出第一个数,再按一下“+”或“-”键,再按出第二个数,最后按一下“=”键,就能够看到运算的结果了。但古代人没有计算器,还好古代中国有算盘这种工具。 CSDN的zjg55543同学在博客里给出了珠算加减法用到的口诀表:珠心算口诀表_zjg555543的博客-CSDN博客
请你尝试把根据输入数的加减运算生成相应的珠算指令序列,每个指令对应于一句或若干句口诀,并该口诀之前输出其所应用的位置和该口诀所涉及的拨珠次数。
个位记为位置0、十位记为位置1、百位记为位置2,以此类推。同样地,十分位记为位置-1,百分位记为位置-2,以此类推。
有的口诀只需要拨动一次上珠或下珠,如“一上一”和“五下五”等。有的则需要拨动一次上珠和一次下珠,如“六上六”、“九下九”、“三下五去二”和“八退一还五去三”(“进一”或“退一”是从相邻高位进一或退一,并不需要在该位执行这一口诀时实际拨珠)等。
最后,输出总拨珠次数,

嗯。。。。珠算口诀?老顾当时看到这个题目,只想问候一下选题的人,这个题目其实难度不是很大,但是他杀时间啊,难道你那5个小时的考试时间都是给这个题准备的?

老顾一脸的蒙的做这个题,还用手机百度了一个珠算口诀表,什么什么几上几进一,什么什么几下几进一,什么什么进了退的还的。。。。老顾已经蒙圈了。

行吧,硬着头皮上吧,好歹把测试用例搞出来。

num = list('零一二三四五六七八九')
act = list('上下去进退还') # 最终也没有用上的定义
t = 0
arr = []
dp = [] # 本来想模拟算盘的上下栏的,最后也没用上
def add(i,v): # 加法处理
	r = 1 # 拨珠次数,其实这个代码里,这个次数计算是错误的
	if arr[i] == 0:
		print(i - 3,r,num[v] + '上' + num[v])
		arr[i] += v
	elif arr[i] + v < 5:
		print(i - 3,r,num[v] + '上' + num[v])
		arr[i] += v
	elif arr[i] > 4 and arr[i] + v < 10:
		print(i - 3,r,num[v] + '上' + num[v])
		arr[i] += v
	elif arr[i] < 5 and arr[i] + v < 10:
		print(i - 3,r,num[v] + '下五去' + num[5 - v])
		arr[i] += v
	else:
		if 10 - v < arr[i]:
			if arr[i] > 4:
				r += 1
				print(i - 3,r,num[v] + '上' + num[9 - v] + '去五进一')
			else:
				print(i - 3,r,num[v] + '去' + num[10 - v] + '进一')
		else:
			print(i - 3,r,num[v] + '去' + num[10 - v] + '进一')
		arr[i] = (arr[i] + v) % 10
		r += add(i + 1,1) # 用来进位
	return r
def add_(i,v):
	#print(i,v,arr[i])
	r = 1
	if v <= arr[i]:
		if v < arr[i] - 5 or v == arr[i]:
			print(i - 3,r,num[v] + '下' + num[v])
		else:
			print(i - 3,r,num[v] + '上' + num[5 - v] + '去五')
		arr[i] -= v
	else:
		if v < 6:
			print(i - 3,r,num[v] + '退一还' + num[10 - v])
		else:
			if arr[i] + 10 - v < 5:
				print(i - 3,r,num[v] + '退一还' + num[arr[i] + 10 - v])
			else:
				r += 1
				print(i - 3,r,num[v] + '退一还五去' + num[arr[i] + 6 - v])
		#print(i - 3,r,'')
		arr[i] += 10 - v
		r += add_(i + 1,1) # 用来退位
	return r
while True:
	try:
		n = str(int(float(input()) * 1000)) # 用来存放三位小数,所以直接乘1000
		f = 1 # 用来记录是加是减
		if n[0] == '-':
			f = -1
			n = n[1:]
		n = n[::-1]
		while len(arr) < len(n) + 1:
			arr.append(0)
			dp.append([0,0])
		for i,v in enumerate(n):
			v = int(v)
			#print(arr)
			if int(v) > 0:
				if f > 0:
					t += add(i,v)
				else:
					t += add_(i,v)
	except:
		break
print(t)

行吧,这个代码其实错漏百出,勉强过了一个用例后,实在没心情搞下去了,从7点搞到快9点还没吃东西,也是够了。

判断题(5分)

算盘是一种古代中国发明的计算机,原因在于人们在操作算盘时可以充分利用人脑的计算能力。
A、对
B、错

正确答案: B 考生答案: A

额。。。。。不了解。

单选题 (共2道)(共10分)

以下选项中,哪一项不属于计算机的本质特征?
A、有计算能力
B、有存储能力
C、受电力驱动
D、受指令控制

这个没什么可说的,算盘也是计算机,他可没有电力

正确答案: C 考生答案: C

人类历史上最早的机械计算机是在1642年由谁发明出来的?
A、布莱兹•帕斯卡
B、戈特弗里德•莱布尼茨
C、查尔斯•巴贝奇
D、乔治•布尔

总感觉这里充满了c站痴呆机器人@programmer_ada 的恶意身影,天天推销csdn冷知识,这次考试就用上了。行吧,咱真不知道答案是啥,手机百度呗。

正确答案: A 考生答案: A

填空题(10分)

如果用“&&”表示布尔代数中的“与”,“||”表示布尔代数中的“或”,“**”表示数学中的幂运算,
则在A=7、B=127、C=65536时,布尔表达式(2**A>B)&&((C/(B+1)C**3)的计算结果是____。
请填写“TRUE”(表示真)或“FALSE”(表示假)(不包括引号)

这题没什么可说的,实际模拟一下就知道答案是 True了。结果考试时,老顾看漏了一对括号,填写了一个 False。。。。。但是,他居然给我分了?行吧,咱也不知道这个题是啥情况,bug已提交,咱可以被扣分,但不能装糊涂。

考生答案
FALSE
参考答案
FALSE

a = 7
b = 127
c = 65536
print((2 ** a >b) and ((c/(b+1)<a+500) or b ** a > c ** 3))
True

总结

题型扩展非常好,但是像编程题2这样的杀时间的题,还是放到周日吧,周三真的不合适。

参考答案,用例测试还是要更用心一些,填空题这个答案还请给个说法。

CSDN 周赛41期_第1张图片
最后,看看排名,如果老顾减去10分,第2到第11名都加10分。。。老顾就名落孙山咯。

你可能感兴趣的:(python,每日一练,python,开发语言,CSDN周赛)