杭高oj 2024暑假作业答案解析

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函数:44dc30bba09b49ee917cb695934a8df7.png

 看编译器里给的提示可知,第一个值为查找的键,第二个值是返回值,默认default

所以我们这里就去查找字典中是否有这个字,有就跳过,没有就加一个这个键值对,值就在先前ASCLL码基础上加一即可

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值