数位排序
问题描述
小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数 n,mn,m, 请问对 1 到 nn 采用这种方法排序时, 排在第 mm 个的元 素是多少?
输入格式
输入第一行包含一个正整数 nn 。
第二行包含一个正整数 mm 。
输出格式
输出一行包含一个整数, 表示答案。
样例输入
13
5
样例输出
3
样例说明
1 到 13 的排序为: 1,10,2,11,3,12,4,13,5,6,7,8,91,10,2,11,3,12,4,13,5,6,7,8,9 。第 5 个数为 3 。
import os
import sys
a=int(input())
b=int(input())
def suan(n):
a=0
n=str(n)
for i in n:
a+=int(i)
return a
# 1-30
lis=[]
for i in range(1,a+1):
lis.append([suan(i),i])
# print(lis)
lis.sort()
print(lis[b-1][0])
# # [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4]
# def bijiao(x,y):
# # if suan(x) < suan(y):
# # return flase
# if suan(x) == suan(y):
# if x < y:
# return flase
# else:
# return true
# print(bijiao(6,2022))
# 请在此输入您的代码封闭图形个数
问题描述
在蓝桥王国,数字的大小不仅仅取决于它们的数值大小,还取决于它们所形成的“封闭图形”的个数。
封闭图形是指数字中完全封闭的空间,例如数字 11、22、33、55、77 都没有形成封闭图形,而数字 00、44、66、99 分别形成了 11 个封闭图形,数字 88 则形成了 22 个封闭图形。值得注意的是,封闭图形的个数是可以累加的。例如,对于数字 6868,由于 66 形成了 11 个封闭图形,而 88 形成了 22 个,所以 6868 形成的封闭图形的个数总共为 33。
在比较两个数的大小时,如果它们的封闭图形个数不同,那么封闭图形个数较多的数更大。例如,数字 4141 和数字 1818,它们对应的封闭图形的个数分别为 11 和 22,因此数字 4141 小于数字 1818。如果两个数的封闭图形个数相同,那么数值较大的数更大。例如,数字 1414 和数字 4141,它们的封闭图形的个数都是 11,但 14<4114<41,所以数字 1414 小于数字 4141。 如果两个数字的封闭图形个数和数值都相同,那么这两个数字被认为是相等的。
小蓝对蓝桥王国的数字大小规则十分感兴趣。现在,他将给定你 nn 个数 a1,a2,…,ana1,a2,…,an,请你按照蓝桥王国的数字大小规则,将这 nn 数从小到大排序,并输出排序后结果。
输入格式
第一行包含一个整数 nn,表示给定的数字个数。
第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an,表示待排序的数字。
输出格式
输出一行,包含 nn 个整数,表示按照蓝桥王国的数字大小规则从小到大排序后的结果,每两个数字之间用一个空格分隔。
样例输入
3
18 29 6
样例输出
6 29 18
样例说明
对于给定的数字序列 [18,29,6][18,29,6],数字 1818 的封闭图形个数为 22,数字 2929 的封闭图形个数为 11,数字 66 的封闭图形个数为 11。按照封闭图形个数从小到大排序后,得到 [29,6,18][29,6,18]。
由于数字 2929 和数字 66 的封闭图形个数相同,因此需要进一步按照数值大小对它们进行排序,最终得到 [6,29,18][6,29,18]。
import os
import sys
# 请在此输入您的代码
# 定义一个函数,用于计算一个数字字符串中封闭图形的数量
def count_closed(num_str):
# 定义一个字典,记录每个数字对应的封闭图形数量
closed = {'0': 1, '4': 1, '6': 1, '9': 1, '8': 2}
sum1=0
# 遍历数字字符串中的每个字符,累加对应的封闭图形数量
for i in str(num_str):
a = closed.get(i, 0)
sum1+=a
return sum1
# return sum(closed.get(c, 0) for c in num_str)
# 读取输入的数字数量
n = int(input())
# 读取输入的数字字符串,并按空格分割成列表
nums = input().split()
# 对数字列表进行排序
# 排序的依据是一个元组,先按封闭图形数量升序排序
# 如果封闭图形数量相同,则按数字的实际大小升序排序
nums.sort(key=lambda x: (count_closed(x), int(x)))
# 将排序后的数字列表用空格连接成一个字符串,并打印输出
print(' '.join(nums))
# 请在此输入您的代码错误票据
题目描述
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的 IDID 号。全年所有票据的 IDID 号是连续的,但 IDID 的开始数码是随机选定的。
因为工作人员疏忽,在录入 IDID 号的时候发生了一处错误,造成了某个 IDID 断号,另外一个 IDID 重号。
你的任务是通过编程,找出断号的 IDID 和重号的 IDID 。
假设断号不可能发生在最大和最小号。
输入描述
输入描述
要求程序首先输入一个整数 N (N<100)N (N<100)表示后面数据行数。
接着读入 NN 行数据。
每行数据长度不等,是用空格分开的若干个(不大于 100 个)正整数(不大于105105)。
输出描述
要求程序输出 1 行,含两个整数 m,nm,n,用空格分隔。
其中,mm 表示断号 IDID,nn 表示重号 IDID。
输入输出样例
示例
输入
2
5 6 8 11 9
10 12 9
输出
7 9import os
import sys
n = int(input())
a=[]
for i in range(n):
a+=list(map(int,input().split()))
for i in range(min(a), max(a)+1):
if a.count(i) == 0:
x = i
if a.count(i) > 1:
y = i
print(x,y)
# 请在此输入您的代码