python程序设计——练习9

1.任意整数各个位数之和

请输入任意一个正整数,求各个位数之和并输出。
输入样例1:

123

输出样例1:

sum=6

代码:

s, sum = input(), 0
for i in s:
    sum += int(i)
print('sum=%d' % sum)

2.列表下标转换

【题目描述】
从键盘输入一个字符串,保证字符串中的元素仅由英文单词构成(单词之间用英文逗号隔开)。请你先对字符串中的元素进行排序(仅排序,不要改变原本的字符串),然后将字符串中的每个元素替换为它们排序后的序号。请将替换后的字符串以列表的形式输出。
【详细解释】序号代表了一个元素有多大。序号编号的规则如下:
1、序号从 1 开始编号;
2、一个元素越大,那么序号越大;
3、果两个元素相等,那么它们的序号相同;
4、英文字母按照首字母的大小进行排序,如果首字母相同,则按第二个字母进行排序,依次类推;
【输入描述】
一行英文单词,单词之间用逗号隔开。
【输出描述】
一个列表。
【输入样例1】

a,a,a

【输出样例1】

[1,1,1]

【输入样例2】

a,a,h,b,c,e,d,f,ab,dd,c,f

【输出样例2】

[1,1,9,3,4,7,5,8,2,6,4,8]

代码:

s = input().split(',')
a = s[::]
a.sort()
ans, id, cnt = [], {}, 1
for i in range(len(a)):
    if not i or a[i] == a[i - 1]:
        id[a[i]] = cnt
    else:
        cnt += 1
        id[a[i]] = cnt
for i in range(len(s)):
    if s[i] != ',':
        ans.append(id[s[i]])
print('[%d' % ans[0], end = '')
for i in range(1,len(ans)):
    print(',%d' % ans[i], end = '')
print(']')

3.稀疏矩阵的表示

【题目描述】
稀疏矩阵,即包含大量值为 0 的矩阵,此类矩阵的一种存储方法是将矩阵中所有非 0 元素所在的位置(行标和列标)和元素值存储在顺序表(数组)中,通过存储由所有非 0 元素的三元组构成的顺序表,和该稀疏矩阵的行数、列数以及非零元素总个数构成的三元组,即可完成对整个稀疏矩阵的存储,这就是稀疏矩阵使用三元组表示的实现思想。
例如:
下面三元组表:
((1,2,12),(1,3,9),(3,1,-3),(3,6,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7),(6,7,8))
最后一个三元组(6,7,8),表示系数矩阵为6行7列,包含8个非零元。
所存储的矩阵为:
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 14 0
0 0 24 0 0 0 0
0 18 0 0 0 0 0
15 0 0 -7 0 0 0
编写程序,从键盘输入一个 m行 x n列 的稀疏矩阵,输出他的三元表表示方法,及转置后的矩阵。
【注意】每输入一行应判断本行的列数是否与 n 相等,若不相等则直接结束程序,并输出’输入错误!’
【输入要求】
第一行,两个正整数 m 和 n 代表矩阵的行数和列数,中间用逗号隔开。
第二~M+1行,为一个稀疏矩阵(该矩阵中的非0元素可为整数或小数)。
【输出要求】
第一行,该稀疏矩阵的三元表示法。
第二~N+1行,为该稀疏矩阵的转置矩阵(注意每个元素占6位,且最后一行不换行。
Sample Input 1

8,5
1 0 0 0 0
3 0 0 0 0 0 0 0

Sample Output 1

Input error in line 2 of the matrix!

Sample Input 2

4,6
1.2 0 0 3 0 0
0 0 0 3.4 0 0
-2 -2.1 0 0 0 0
0 0 0 1 0 0.0

Sample Output 2

Triplet List:
((1, 1, 1.2), (1, 4, 3), (2, 4, 3.4), (3, 1, -2), (3, 2, -2.1), (4, 4, 1), (4, 6, 6))
Transpose matrix:
1.2 0 -2 0
0 0 -2.1 0
0 0 0 0
3 3.4 0 1
0 0 0 0
0 0 0 0.0

代码:

m,n = map(int,input().split(','))
a,ans,cnt = [],[],0
for i in range(m):
    a.append(list(map(eval,input().split())))
    if len(a[i]) != n:
        print(f'Input error in line {i+1} of the matrix!')
        exit()
for i in range(m):
    for j in range(n):
        if a[i][j] != 0:
            ans.append((i+1,j+1,a[i][j]))
            cnt += 1
ans.append((m,n,cnt))
print('Triplet List:')
print(tuple(ans))
print('Transpose matrix:')
for i in zip(*a):
    for j in i:
        print(f'{j:^6}',end=' ')if i != zip(*a)[-1]:print()

4.有序列表插入元素

【题目描述】
从键盘上获取一个已按升序排好的整数列表(测试样例的数都已严格按照升序输入),用户输入一个待插入的整数,编写程序,实现插入该数后,列表后仍保持有序。
【输入描述】
样例输入:
1、列表元素由空格隔开。
2、待插入的整数。
【输出描述】
样例输出:
输出后的列表为X,插入后的索引值为X
若插入元素的值与已有列表中的元素相同,则X为最大下标索引值。
【输入样例1】

1 2 3 3 3 4
3

【输出样例1】

输出后的列表为[1, 2, 3, 3, 3, 3, 4],插入索引值为5

代码:

a = list(map(int, input().split()))
b = eval(input())
a.append(b)
a.sort()
print('输出后的列表为', end = '')
print(a, end = '')
print(',插入索引值为%d' % (a.index(b) + a.count(b) - 1))

5.列表合并去重

【题目描述】
输入两个列表alist和blist,要求列表中的每个元素都为正整数且不超过10;合并alist和blist,并将重复的元素去掉后输出一个新的列表clist。同时为保证输出结果一致,请将列表clist内元素按升序排序之后再输出。
【输入描述】
共两行,每一行都用来输入列表中的元素值,以空格隔开。
【输出描述】
共一行,以列表形式打印输出。
【输入样例1】

1 2 3
4 3 2

【输出样例1】

[1, 2, 3, 4]

代码:

a = list(map(int, input().split()))
b = list(map(int, input().split()))
print(list(set(a + b)))

6.单词的区域

Description
输入一个列表 words ,列表中的元素全部为由字符串组成的单词,遍历整个列表,将所有可以使用键盘中同一区域字母打印出来的单词,和其所对应的颜色区域组成”键值对“存入字典当中,并输出。键盘如下图所示。
在这里插入图片描述
美式键盘中:
红色区域由字符 “qweasdzxc” 组成。
蓝色区域由字符 “rtyfghvbn” 组成。
黄色区域由字符 “uiopjklm” 组成。
Input
一行仅由单词组成的字符串,单词之间用空格隔开。
Output
一行,单词区域的字典。
Sample Input 1

sea hello Dad Peace try pop

Sample Output 1

{‘Red’: [‘sea’, ‘Dad’], ‘Blue’: [‘try’], ‘Yellow’: [‘pop’]}

Sample Input 2

BLUE red yellow pink

Sample Output 2

{‘Red’: [], ‘Blue’: [], ‘Yellow’: []}

代码:

def check(x, y):
    for i in x:
        if y.find(i)==-1:
            return False
    return True
s = list(input().split())
a= {'qweasdzxc':'Red', 'rtyfghvbn':'Blue', 'uiopjklm':'Yellow'}
ans = {'Red':[], 'Blue':[], 'Yellow':[] }
for i in s:
    flag = False
    for j in a.keys():
        if check(i.lower(),j):
            flag = True
            ans[a[j]].append(i)
            break
print(ans)

7.查验身份证

【题目描述】
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:首先对前17位数字加权求和,权重分配为:[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
【输入描述】
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
【输出描述】
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
【输入样例1】

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

【输出样例1】

12010X198901011234
110108196711301866
37070419881216001X

【输入样例2】

2
320124198808240056
110108196711301862

【输出样例2】

All passed

代码:

n = int(input())
m = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
z = '10X98765432'
flag = True
while(n):
    n -= 1
    s = input()
    x = list(''.join(s[:]))
    res = 0
    for i in range(0,17):
        if x[i] != 'X':
            res += m[i] * int(x[i])
    if x[-1] != z[res % 11]:
        print(s)
        flag = False
if flag:
    print('All passed')

8.亲和数

【题目描述】
古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:1+2+4+5+10+11+20+22+44+55+110=284。
而284的所有真约数为1、2、4、71、 142,加起来恰好为220。
人们对这样的数感到很惊奇,并称之为亲和数。
一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
你的任务就编写一个程序,判断给定的两个数是否是亲和数。
【输入描述】
两个整数A,B; 其中 0 <=A,B <=600000 ;
【输出描述】
如果A和B是亲和数的话输出YES,否则输出NO。
【输入样例1】

220 284

【输出样例1】

YES

【输入样例2】

100 200

【输出样例2】

NO

代码:

a, b = map(int, input().split())
def get(x):
    res = 0
    for i in range(1,x):
        if x % i == 0:
            res += i
    return res
if get(a) == b and get(b) == a:
    print('YES')
else:
    print('NO')

9.乘积的列表

【题目描述】
给定一个包含若干个整数的列表alist,要求返回输出列表blist,blist中的元素为除与alist对应位置上的元素之外其余各元素的乘积。(注:原列表的1位于1号位置,结果应该等于除去1号位置的其他元素的积,对应输出6=23,原列表的2,对应输出3=13,原列表的3,对应输出2=1*2)
【输入描述】
共一行,元素以空格隔开。
【输出描述】
共一行,为一个列表。
【输入样例1】

1 2 3

【输出样例1】

[6, 3, 2]

代码:

a = list(map(int, input().split()))
sum = 1
for i in a:
    sum *= i
if not sum:
    b = []
    for i in range(len(a)):
        cnt = 1
        for j in range(len(a)):
            if j != i:
                cnt *= a[j]
        b.append(cnt)
    print(b)
else:
    b = [sum // i for i in a]
    print(b)

10.矩阵相加

Description
正整数n,代表要输入的是n*n的矩阵,两个矩阵由用户输入,计算输出两个矩阵相加的和。
Input
一个整数n,和两个矩阵的值。
Output
两个矩阵相加后的值,每个元素占三位,中间对齐,元素之间由两个空格组成。
Sample Input 1

3
12 3 -5
1 -9 0
3 6 8
1 8 9
6 5 4
3 2 1

Sample Output 1

13 11 4
7 -4 4
6 8 9

代码:

n = int(input())
a = [[]for i in range(n)]
for i in range(n):
    a[i] = list(map(int,input().split()))
for i in range(n):
    a[i] = [j + k for j, k in zip(a[i], list(map(int,input().split())))]
for i in range(n):
    for j in range(n):
        print(f'{a[i][j]:^3}', end='  ')
    print()

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值