A 龟爷爷过生日
yy,mm,dd = map(int,input().split(' '))
age = int(input())
day_all = 1
def judge_year(year):
if year % 400 == 0:
return 1
if year % 4 == 0 and year % 100 != 0:
return 1
return 0
for i in range(0,age):
day_all += 365
if judge_year(yy + i):
day_all += 1
if mm > 3:
if judge_year(yy):
day_all -= 1
if judge_year(yy + age):
day_all += 1
print(day_all)
思路:
1.首先构造函数judge_year判断是否为闰年,如果可以被400整除无需继续判断,如果两个条件都不符合返回0
2.循环判断每一年
3.如果月份大于3,说明出生的时候没有过闰日,但是在第二步判断是将这一天加上了,而今年的闰日他实际过了的、,但是循环中并没有判断,所以写一个特判
B 英文句子首字母大写
a = input()
flag = 0
ans=''
for i in a:
if flag == 0:
if i>='a' and i<='z':
i = chr(ord(i)-32)
flag = 1
if i>='a' and i<='z' and flag == 2:
i = chr(ord(i)-32)
flag=3
if i == ' ' or i ==',':
flag = 2
ans+=i
print(ans,end='')
思路 :
1.核心思路是使用flag标记字符串的状态:
flag值 | 意义 |
0 | 指向整个句子第一个字符,首字母一定大写 |
2 | 指向前面有空格或者逗号的单词的首字母,首字母要大写 |
3 | 指向空格和逗号,下一个字符为需要大写的字母 |
C 最大篱笆地
n=int(input())
maxn=0
print("长 宽 面积")
for l in range(1,(n-1)//2+1):
w=n-l*2
area=l*w
print("{:2}".format(l),"{:2}".format(w),"{:3}".format(area))
maxn = max(maxn,area)
print("最大面积是:",maxn)
思路:
1.核心是range中的范围,简单的讲就是使长和宽都不为0的范围,用数学里的化单变量就好了
2.注意输出格式,format可以控制每一个输出的宽度
D 字符串统计分析
s=input()
numA=numa=num0=0
for i in s:
if i >= 'A' and i <= 'Z':
numA+=1
elif i >= 'a' and i <= 'z':
numa+=1
elif i >= '0' and i <= '9':
num0+=1
print("大写字母:",numA,"个")
print("小写字母:",numa,"个")
print("数字字符:",num0,"个")
思路:
1.输入字符串,遍历一遍,可以用‘A’,'0'等代表对应的ASCLL码
E 推算星期(P100)
yy,mm,dd = map(int,input().split('-'))
if mm == 1 or mm == 2:
mm += 12
yy -= 1
yy_temp = str(yy)
c = int(yy_temp[0:2])
y = int(yy_temp[2:4])
m = mm
d = dd
date=['星期日','星期一','星期二','星期三','星期四','星期五','星期六']
w = y + (y//4) + (c//4) - 2*c + (26*(m+1)//10) + d - 1
print(date[w%7])
思路:
1.主要是对数据的预处理,然后直接套公式即可
F 奇偶检验
s=int(input())
n,t=0,""
while s>0:
r=s%2
n+=r
t = chr(ord('0')+r) + t
s//=2
print(t)
print((n+1)%2)
思路:
1.转二进制的变式,具体的方法可以参见题目H(F是代码填空,H的方法速度快,便于理解)
2.用n存储1的个数,最后取模即可
G 完数与盈数
import math
a = int(input())
num = 1
for i in range(2,math.floor(math.sqrt(a))+1):
if a % i == 0:
num = num + i + a / i
if num == a:
print("完数")
elif num > a:
print("盈数")
else:
print('None')
思路:
1.很简单的便利,注意为了提升效率只需要到根号a即可,注意要向下取整并加一,可以保证完全平方数的相等因子被包含在内
H A类数B类数
b = int(input())
def temp(a):
num0 = num1 = 0
while a > 0:
if a % 2 == 0:
num0 += 1
else:
num1 += 1
a = a >> 1
if num1 > num0:
return 1
return 0
num_a = 0;num_b = 0
for i in range(1,b + 1):
if temp(i):
num_a += 1
else:
num_b += 1
print(num_a,num_b)
思路:
1.与F题类似,统计一个整数的二进制数中0和1的个数,可以使用以下技巧
a.一个数的二进制的第一位代表2^0次方,所以最小这位是0,那么就是偶数,同理,偶数的最小一位是0,所以可以通过不断向2取模判断奇偶来判断这个整数最小一位的0还是1
b.位移运算>>和<< 可以理解为将这个整数的二进制整体左移或者右移,左移在多出的一位自动补0,右移则是直接将最小一位抹去
c.将a和b搭配,取出最小一位的值,再使用>>右移运算将这一位抹去,反复操作直至这个整数为0即可快速获得这个整数的二进制,并且顺便将这个二进制遍历一遍,便于个数统计
I 信息加密
a = input()
temp1 = a[0:(len(a)+1)//2]
temp2 = a[(len(a)+1)//2:len(a)]
if len(temp1)!=len(temp2): temp2+=' '
for i in range(0,max(len(temp1),len(temp2))):
print(temp1[i],temp2[i],sep='',end='')
思路:
1.只需要将字符串切割并且错开输出即可
J 成语分类
a = input()
z = {};temp = 0
for i in a:
if z.get(i,1) == 1:
z[i] = chr(ord('A')+temp)
temp += 1
for i in a:
print(z[i],end='')
思路:
1.本题使用字典效率较高,以成语每个字为键,ABCD为值
2.get函数:
看编译器里给的提示可知,第一个值为查找的键,第二个值是返回值,默认default
所以我们这里就去查找字典中是否有这个字,有就跳过,没有就加一个这个键值对,值就在先前ASCLL码基础上加一即可