1.小数第n位
- 问题描述:我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式.本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。
- 输入格式:一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)
- 输出格式:一行3位数字,表示:a除以b,小数后第n位开始的3位数字。
- 样例输入:1 8 1
- 样例输出:125
- 样例输入:1 8 3
- 样例输出:500
- 样例输入:282866 999000 6
- 样例输出:914
具体代码😦)
# 与>>类似“<< 左移” 左移一位表示乘2,二位就表示4,就是2的n次方 “>> 右移,高位补符号位” 这里右移一位表示除2“>>> 无符号右移,高位补0”;
def quickmi(a,n):
res=1
while n:
if n%2!=0:
res*=a%mod
a*=a%mod
n>>=1
return res%mod
a, b, n = map(int, input().split())
mod=b*1000
c=a/b
# print(c)
c=int(c*quickmi(10,n+2))
x=c%1000
print(x)
运行结果:
2.Excel地址
- 问题描述:Excel单元格的地址表示很有趣,它使用字母来表示列号。
比如,
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,
…
当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
本题目即是要求对输入的数字, 输出其对应的Excel地址表示方式。 - 样例输入:26
- 样例输出:Z
- 样例输入:27
- 样例输出:AA
- 样例输入:2054
- 样例输出:BZZ
具体代码😦)
n=int(input())
a=[]
while n:
if n%26==0:
a.append(26)
n=n//26-1
else:
a.append(n%26)
n=n//26
for i in range(len(a)):
print(chr(a[len(a)-1-i]+64),end='')
运行结果:
3.对局匹配
- 问题描述:小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。
小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K,系统都不会将他们匹配。
现在小明知道这个网站总共有N名用户,以及他们的积分分别是A1, A2, … AN。
小明想了解最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于K)? - 输入格式 :第一行包含两个个整数N和K。 第二行包含N个整数A1, A2, … AN,对于30%的数据,1 <= N <= 10 对于100%的数据,1 <= N <= 100000, 0 <= Ai <= 100000, 0 <= K <= 100000
- 输出格式 :一个整数,代表答案。
- 样例输入:
10 0
1 4 2 8 5 7 1 4 2 8 - 样例输出:6
具体代码😦)
n,m=list(map(int,input().split()))
arr=list(map(int,input().split()))
cout=0
for i in range(0,len(arr)):
for j in range(i+1,len(arr)):
if arr[i]-arr[j]==m:
cout+=1
else:
continue
# print(arr)
print(n-cout)
运行结果:
4.k倍区间
- 问题描述:给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
你能求出数列中总共有多少个K倍区间吗? - 输入格式 :第一行包含两个整数N和K。(1 <= N, K <= 100000)以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
- 输出格式 :输出一个整数,代表K倍区间的数目。
- 样例输入:
5 2
1
2
3
4
5 - 样例输出:6
具体代码:(但是只通过两个,28分)
n,m=list(map(int,input().split()))
a=[]
b=[0]
cout=0
for i in range(n):
a.append(int(input()))
b.append(sum(a))
# print(a)
# print(b)
for i in range(1,n+1):
for j in range(i,n+1):
if (b[j]-b[i-1])%m==0:
cout+=1
print(cout)
运行结果:
5.小朋友排队
- 问题描述:n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。
每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。
如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k次交换时,他的不高兴程度增加k。
请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。
如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。 - 输入格式 :输入的第一行包含一个整数n,表示小朋友的个数。第二行包含 n 个整数 H1 H2 … Hn,分别表示每个小朋友的身高。
- 输出格式 :输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。
- 样例输入:
3
3 2 1 - 样例输出:9
具体代码:(但是只通过两个,其它的全部超时,只有20分)
- 解题思想:先创建一个3行N列的矩阵,第一行就是输入的我们输入的数,第二行是根据输入的数的个数创建相同个数的0,用来表示每个小朋友不高兴程度的累积,一开始为0,第三行就是与n相同个数的1,用来表示他们一开始不高兴程度的增加的初始值,后面随着两两交换,这两个数对应的第三行各自加到第二行,并且第三行自动加1,表示下一次当前小朋友移动的话会多一个值增加,并且这两个小朋友所在的第一行第二行第三行也要互相交换位置,最后我们得到的第二行就是每个小朋友的不高兴程度的值,通过迭代加起来即可,但是这种解法虽然可以通过,却只有两个正确得到20分,其它的全部超时,说明思路是没问题的,代码还需要改进。
def m_swap(a,b):
t=int(b)
b=int(a)
a=t
return a,b
def change(list):
result = []
for i in range(n):
result.append(re_list[0][i])
return result
n=int(input())
arr=list(map(int,input().split()))
arr_i=arr[:]
arr_i.sort()
arr1=[0 for i in range(n)]
arr2=[1 for i in range(n)]
list=arr+arr1+arr2
re_list=[arr,arr1,arr2]
# for i in re_list:
# for j in range(n):
# print(i[j],end=' ')
# print()
# print('****************************begin**********************************')
for k in re_list:
for j in range(0,n-1):
if k==re_list[0]:
if k[j]>k[j+1]:
re_list[1][j]+=re_list[2][j]
re_list[1][j+1]+=re_list[2][j+1]
re_list[2][j]+=1
re_list[2][j+1]+=1
re_list[0][j],re_list[0][j+1]=m_swap(int(re_list[0][j]),int(re_list[0][j+1]))
re_list[1][j], re_list[1][j + 1] =m_swap(int(re_list[1][j]),int(re_list[1][j + 1]))
re_list[2][j], re_list[2][j + 1] =m_swap(int(re_list[2][j]),int(re_list[2][j + 1]))
# 每次换位置之后数组显示
# for i in re_list:
# for j in range(n):
# print(i[j], end=' ')
# print()
# print("****************************************************************")
result=change(re_list[0])
# print(result)
while result!=arr_i:
for k in re_list:
for j in range(0, n - 1):
if k == re_list[0]:
if k[j] > k[j + 1]:
re_list[1][j] += re_list[2][j]
re_list[1][j + 1] += re_list[2][j + 1]
re_list[2][j] += 1
re_list[2][j + 1] += 1
re_list[0][j], re_list[0][j + 1] = m_swap(int(re_list[0][j]),
int(re_list[0][j + 1]))
re_list[1][j], re_list[1][j + 1] = m_swap(int(re_list[1][j]),
int(re_list[1][j + 1]))
re_list[2][j], re_list[2][j + 1] = m_swap(int(re_list[2][j]),
int(re_list[2][j + 1]))
# 每次换位置之后数组显示
# for i in re_list:
# for j in range(n):
# print(i[j], end=' ')
# print()
# print("****************************************************************")
result = change(re_list[0])
sum=0
for i in range(n):
sum+=re_list[1][i]
print(sum)
运行结果:
6.单词分析
- 问题描述:小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。
- 输入格式 :输入一行包含一个单词,单词只由小写英文字母组成。
- 输出格式 :输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
- 样例输入:lanqiao
- 样例输出:
a
2
具体代码:
from collections import Counter
n=input()
arr=[]
for i in range(len(n)):
arr.append(n[i])
# print(arr)
a=Counter(arr)
# print(a)
b=a.most_common(3)
# print(b)
for i in range(len(b)-1):
if b[i][1]==b[i+1][1]:
if b[i][0]>b[i+1][0]:
print(b[i+1][0])
print(b[i+1][1])
break
else:
# print(b[i][0])
# print(b[i][1])
print(a.most_common(1)[0][0])
print(a.most_common(1)[0][1])
break
运行结果:
7.成绩分析
- 问题描述:
小蓝给学生们组织了一场考试,卷面总分为 100分,每个学生的得分都是一个 0到100的整数。请计算这次考试的最高分、最低分和平均分。 - 输入格式 :输入的第一行包含一个整数 ,表示考试人数。
接下来 n行,每行包含一个 0至100的整数,表示一个学生的得分。 - 输出格式 :
输出三行。
第一行包含一个整数,表示最高分。
第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。 - 样例输入:
7
80
92
56
74
88
99
10 - 样例输出:
99
10
71.29
具体代码:
def avg(list,sum):
return sum/len(list)
n=int(input())
arr=[]
for i in range(n):
arr.append(int(input()))
# print(arr)
sum=sum(arr)
print(max(arr))
print(min(arr))
print('%.2f'%avg(arr,sum))
运行结果:
8.成绩统计
- 问题描述:
小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。
如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。 - 输入格式 :输入的第一行包含一个整数 ,n表示考试人数。
接下来 n行,每行包含一个0至100的整数,表示一个学生的得分。 - 输出格式 :输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。
- 样例输入:
7
80
92
56
74
88
100
0 - 样例输出:
71%
43%
具体代码:
def cout(arr):
sum_excellent=0
sum_fail=0
for i in range(n):
if arr[i]<60 :
sum_fail+=1
if arr[i]>=85:
sum_excellent+=1
return sum_fail,sum_excellent
if __name__ == '__main__':
import math
n=int(input())
arr=[]
for i in range(n):
arr.append(int(input()))
a,b=cout(arr)
# print(int((1-a/n)*100),'%',sep='')
# print(int((b/n)*100),'%',sep='')
# Math.floor(x) // 返回小于x的最大整数 Math.ceil(x) // 返回大于x的最小整数 Math.round() 返回四舍五入后的整数
print('{}%'.format(round((1-a/n)*100)))
print('{}%'.format(round((b/n) * 100)))
运行结果:
![
9.回文日期
问题描述:
输入格式 :
输出格式 :
样例输入:20200202
样例输出:
20211202
21211212
具体代码:
def is_hui(x):
x=str(x)
if x==x[::-1]:
return True
else:
return False
def is_run(x):
if (x%4==0 and x%100!=0) or x%400==0:
return True
else:
return False
def is_AB(x):
x=str(x)
if (x[0]==x[2]==x[5]==x[7]) and (x[1]==x[3]==x[4]==x[6]):
return True
else:
return False
n=input()
year=int(n[0:4])
month=int(n[4:6])
day=int(n[6:])
# print(year,month,day)
i=1
flag=True
result=[]
result1=[]
while flag:
day+=1
if day==32 and month==12: # 年份+1的情况
month=1
day=1
year+=1
# print(year,month,day)
if (day==32 and (month==1 or month==3 or month==5 or month==7 or month==8 or month==10)): # 奇数月+1的情况
day=1
month+=1
if (day==31 and (month==4 or month==6 or month==9 or month==11)): # 偶数月+1的情况
day=1
month+=1
if (day==30 and month==2 and is_run(year)): # 是闰年2月的情况
day=1
month+=1
if (day==29 and month==2 and is_run(year)!=True): # 不是闰年2月的情况
day=1
month+=1
# if month==0:
# month+=1
num=year*10000+month*100+day
if is_hui(num):
result.append(num)
if is_AB(num):
result1.append(num)
break
# print(i)
# print(result)
print(result[0])
print(result1[0])
运行结果:
10.数字三角形
问题描述:
输入格式 :
输出格式 :输出一个整数,表示答案。
样例输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5样例输出:27
具体代码:
def DigitalTriangle():
import copy
n = int(input())
arrs=[]
for i in range(n):
arrs.append(list(map(int,input().split())))
temp_list = copy.deepcopy(arrs) # 这里的temp_list实际存储的是左下和右下路径长度
# print(temp_list)
for i in range(1, n):
for j in range(i):
# print(i,'****',j)
temp_list[i][j]=max(temp_list[i-1][j],temp_list[i-1][j-1])+arrs[i][j]
#print(temp_list)
if n%2==1:
print(temp_list[n-1][int(n/2)])
else:
if temp_list[n-1][n//2] > temp_list[n-1][n//2-1]:
print(temp_list[n-1][n//2])
else:
print(temp_list[n - 1][n // 2]-1)
DigitalTriangle()
运行结果:
11.回文数字
- 问题描述:
- 输入格式 :
- 输出格式 :
- 样例输入:44
- 样例输出:
99899
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499
具体代码:
def is_hui(x):
x=str(x)
if x==x[::-1]:
return True
else:
return False
def sum_hui(x):
x=str(x)
sum=0
for i in range(len(x)):
sum+=int(x[i])
# print(sum)
return sum
n=int(input())
if n>54: # t通过上面的sum可以看到最大的n为54
print(-1)
else:
for i in range(10000,1000000):
if is_hui(i):
if sum_hui(i)==n:
print(i)
运行结果:
12.日期问题
- 问题描述:
- 输入格式 :一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)
- 输出格式 :输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。
- 样例输入:02/03/04
- 样例输出:
2002-03-04
2004-02-03
2004-03-02
具体代码:
def is_run(x):
if (x%4==0 and x%100!=0) or x%400==0:
return True
else:
return False
def default(x,y,z):
# 这些日期都在1960年1月1日至2059年12月31日。
if x>=0 and x<=59:
x+=2000
elif x>=60 and x<=99:
x+=1900
# 月份小于0或者大于12的排除
if y<=0 or y>12:
return False
# 天数小于0或者大于31的排除
if z<=0 or z>31:
return False
if is_run(x) and y==2 and z>29: # 闰年2月为29天
return False
if is_run(x)==False and y==2 and z>28: # 闰年2月为28天
return False
if (y==4 or y==6 or y==9 or y==11) and z>30:
return False
if (y==1 or y==3 or y==5 or y==7 or y==8 or y==12) and z>31:
return False
else:
if y<10:
y=str(0)+str(y)
if z<10:
z=str(0)+str(z)
arr.append(str(x) + '-' + str(y) + '-' + str(z))
return
n=input()
year=int(n[0:2])
month=int(n[3:5])
day=int(n[6:9])
arr=[]
x11,y11,z11=0,0,0
x21,y21,z21=0,0,0
x31,y31,z31=0,0,0
if year==4:
default(year,month,day)
default(day,month,year)
default(day,year,month)
# set 有去重复的功能
"""
aa = [1,2,2,3,3,2,7,8,9]
print(len(set(aa)))
"""
for i in range(len(set(arr))):
print(arr[i])
else:
default(day, month, year)
default(year, month, day)
default(day, year, month)
for i in range(len(set(arr))):
print(arr[i])
运行结果: