内容正文:
信息素养大考代码
1.
C: d059: 完全数
题目描述
给出 5 个数字,判断是否是完全数,是,输出 1,否则输出 0
注:完全数是指,它的所有小于它本身的因子之和,正好等于它本身。
如:6=1+2+3(6=1*2*3),所以 6 是完全数
输入
一行 5 个整数
输出
一行 5 个 0 或者 1
C 参考代码:
a=list(map(int,input().split()))
def wqs(m):
if m==1:return 0
ans=1 # ans #用来存放整数 m 的所有因子,因子一定存在 1,由于因子不包含 m 本身,因此,其余因子可能存在的范围是[2..m//2]
for i in range(2,m//2+1):
if m%i==0:
ans+=i
return ans
for i in range(5):
if a[i]==wqs(a[i]):
print(1,end=' ') # end=’ ’, #修改 print()默认数据输出,默认是数据输出然后换行
else:
print(0,end=' ')
print()
2.
问题 H: d029: 求出 2-100之间的所有质数(素数)
题目描述:求出 2-100 之间的所有质数(素数)
输入
输入说明: 无
输出
输出说明: 一行一个素数
参考代码:
hash=[1]*101 # 构建筛 hash[1..100],用筛法处理,1 表示数据为素数
hash[0]=0; hash[1]=0 # 0,1 是合数,先筛掉
k=int(100**0.5)
# 任何合数其较小因素范围<=int(m**0.5),若 m 是合数则一定会在[2..int(m**0.5)]这个范围内筛掉
for i in range(2,k+1):
if hash[i]==1:
m=i+i
while m<=100: # 筛掉所有存在 i 的因素的数据:[i+i,i+i+i,...)
hash[m]=0
m+=i
for i in range(2,101):
if hash[i]==1: # 没有被筛掉的数即为素数
print(i)
3.
问题 I: 【入门题】d038: 星罗密布
题目描述 输出图形
*****$
***$$$
*$$$$$
规律是...自己发现吧。 要求输入 3,输出上面三行的图形
参考代码:
n=int(input())
for i in range(1,n+1):
k2=2*i-1; k1=2*n-k2 # k1 是当前第 i 行字符’*’的个数;k2 是字符’$’的个数;
for j in range(k1):
print('*',end='')
for j in range(k2):
print('$',end='')
print()
4.
问题 M: 【入门题】d078: 圆盘找数
题目描述
圆盘上有 20 个格子,每个格子存了一个整数,,找出 4个相邻的数,使其相加之和最大是哪 4 个数?
并给出它们的起始位置以及 4 数之和。如果和相同,输出起点靠前的位置(第一个数位置为 1,顺时针转)
输入
一行 20 个数
输出
一行两个整数,第一个代表起始位置,第二个代表和。
参考代码:
a=list(map(int,input().split()))
a=a*2 # 循环处理方法:复制数据,然后前后拼接,可将环形转问题换成线性问题
ans=a[0]+a[1]+a[2]+a[3]; pos=0; m=ans # 预设 ans 初始值,选择的是 0 位置开头的连续 4 个数据
for i in range(1,20):
m=m-a[i-1]+a[i+3] # 求当前 m:位置 i 开头的连续 4 个数据:a[i-1]+ (a[i]+a[i+1]+a[i+2]+a[i+3])
if m>ans: # 若 m 更大则更新 ans
ans=m; pos=i
print("%d %d" %(pos+1,ans)) # 开始位置标记是 1,不是 0,因此输出时有调整
5.
问题 P: 【入门题】d127: 矩阵最大值
题目描述
编写一个程序输入一个 m*n 的矩阵存储并输出,并且求出每行的最大值和每行的总和。
要求把每行总和放入每行最大值的位置,如果有多个最大值,取下标值最小的那一个作为最大值。
最后将结果矩阵输出。
输入
输入的第一行包括两个整数 m 和 n(1<=m,n<=100),分别代表矩阵的行和列的维数。
接下来的 m 行每行有 n 个数,代表矩阵的元素。
输出
输出按题目要求执行后的矩阵。
参考代码:
m,n=map(int,input().split())
# a=[[0 for i in range(n+1)] for j in range(m+1)] 不需要构建矩阵
for i in range(m): # 逐行进行处理,当前处理第 i 行
b=list(map(int, input().split())) # 将当前行所有数据处理成列表
maxt=b[0]; pos=0; sum=maxt # maxt 预设当前行元素的最大值,pos 预设最大值所在的索引位置
for i in range(1,n):
if b[i]>maxt: # 更新最大值即索引位置
maxt=b[i]; pos=i
sum+=b[i]
b[pos]=sum # 按题意要求用所有数据的和 sum 更新 pos 位置的值
for i in range(n): # 输出处理后的第 i 行
print("%d " %b[i],end='')
print()
6.
问题 S: 【入门题】xx016:李小子抄答案
题目描述:李小子意外得到一份答案,为防止他人得到后抄从而超过自己,李小子将其转成字符串 s1。
若你想要获取答案,方法如下:
字符串 s1中所有数字相加,得到整数 m,整数 m 的十位当作 A 的前缀,整数 m的个位当作 B的前缀。
字符串 s1中所有字母个数为 C 的前缀,字符串 s1中所有其他字符个数(除数字、字母外)为 D 的前
缀。在将得到的结果看成十六进制,并将其转换成十进制后,4个结果进行累加,即为答案。
如:2021EDGnb!!!!
(1) 2+0+2+1=5; 因此,得到: 0A 和 5B
(2)EDGnb 共计 5个字母; 因此,得到:5C
(3)!!!!,共计有 4 个其他字符(除数字、字母外); 因此,得到:4D
0AH + 5BH + 5CH + 4DH=270 所以,问题解的答案是 270
输入:2021EDGnb!!!!
输出:270
参考代码 1:
s1=input().strip()
m=0; n=0; p=0
for c1 in s1:
if '0'<=c1<='9': # 1.统计数字字符
m+=int(c1)
elif c1.isalpha(): # 2.统计字母字符
n+=1
else: # 3.统计其他字符
p+=1
# 按题意要求进行处理
ans=(m%100)//10*16+10+m%10*16+11+int(str(n),16)*16+12+int(str(p),16)*16+13
print(ans)
S 参考代码 2:
s1=input().strip()
m=0; n=0; p=0
def Hex(d): # 直接将 10 进制数据看成 16 进制数据,同时完成计算
ans=0; k=1
while d>0:
ans+=(d%10)*k
d//=10; k*=16
eturn ans
for c1 in s1:
if '0'<=c1<='9':
m+=int(c1)
elif c1.isalpha():
n+=1
else:
p+=1
ans=(m%100)//10*16+10+m%10*16+11+Hex(n)*16+12+Hex(p)*16+13
print(ans)
学科网(北京)股份有限公司
$$