蓝桥杯课后作业题

一、闰年问题

facd8d8c000c423d93bb8bed130c6ab8.jpeg

闰年:

1、能被4整除而不能被100整除

2、能被400整除(其实这个隐含了一个条件,那就是能被400整除的数,它必定能被4整除,然后我们综合条件1和条件2,可以求解。)

287be157751345918c629f6e6bade818.png

另外一种解法就是平铺直叙了,也比较容易想:

1e62dee123f143b19e4f9a30078ad10b.png

 二、

2.1给定一天是一周的某一天,问n天之后是周几?

5a7f94b8036740d28d034f0c7a4b8063.png

自己的解法: 

import os
import sys
w=int(input())
n=int(input())
a=w+n%7 #对于增量n来说,只有n对于7取余数才会对a产生影响
if a%7!=0: #如果w和n对于7的余数较大.求和后可能会大于7,所以不能直接print,需要再取一次余数
  print(a%7)
else:
  print(7)

 别人的解法:

import os
import sys

# 请在此输入您的代码
#这种解法非常简单,思想非常精妙。我们可以想象一个刻度尺,把周一和周天当作较长的刻度线。w为刻度尺上的起点,n表示前进几条刻度线。而x则表示最后的终点。现在问的是最后x停在周一那条长刻度线前面几格。
w = int(input())
n = int(input())
x = (w+n)%7  #求的是x停在周天那条长刻度线前面几格。
if x == 0 :  #表示正好停在周天那条刻度线上,也就是周天。
    x = 7
print(x)  #如果不停在周天,那么余数也就是周几

 2.2 输出2000到2020年的每一天

 日期分为年月日,2000年1月一日,一月二日等等等........。因为有三个变量年月日,所以为三层循环。

自己写的(我自己敲了两遍,一遍生,两遍熟)

for i in range(2000,2021):
    for j in range(1,13):
        if j==2:
            if i%4==0 and i%100!=0 or i%400==0:
                for k in range(1,30):
                    print(i, j, k)
            else:
                for k in range(1, 29):
                    print(i, j, k)
        elif j==1or j==3or j==5 or j==7 or j==8 or j==10 or j==12:
            for k in range(1,32):
                print(i,j,k)
        else:
            for k in range(1,31):
                print(i,j,k)

答案的方法更简单,引入了一个变量up,从而使得关于天的循环只需要写一次就好了,比较巧妙。

三、特别数的和 

 75e509e660624bf2b90a7bbc4afba803.png

错误解法:

基础思想是正确的,第6行错了 

39a51c79a5a54039b3a7c023b20a3291.png

如果这样写的话就是恒真 :

8ad04ffea71845d185fb3cac9cb3d3da.jpeg

 这么表达就对啦!

n=int(input())
count=0
for i in range(1,n+1):
  if "2"in str(i)or"0"in str(i)or"1"in str(i)or"9"in str(i):
    count+=i
print(count)   

四、求两个数的最大公约数

71716e018f8d424bb2a254a7971aceb6.jpegb40a56ef5fab4a9784c60f89465b8198.jpeg

注意m是较大的数,n是较小的数。

除着除着,如果最后两数能够整除,也就是余数为零,那么这两个数的最大公约数也就是初始两数的最大公约数。显而易见,既然两数能够整除,那么最大公约数也就是较小的那个数n。

m=int(input())
n=int(input())
r=m%n
while r!=0:
    m=n
    n=r
    r=m%n
print("最大公约数是",n)

五、求n个数阶乘的和

c263390368ad4e9d83342e26942ce3c6.png

思路很清晰明了,外层循环求和,内层循环求每个数的阶乘 

7a3bb8e7687c42f99d8e97428713aaaa.png

 切忌眼高手低,下图代码我自己写的,但是结果不对,因为第三行abs=1应该写在第四行下面,这样才能让内层循环完之后,abs仍然=1。这样写的话,实际上是求的1!+1!×2!+1!×2!×3!+......

n=int(input())
sum=0 #求阶乘之和
abs=1
for i in range(1,n+1):
    for j in range(1,i+1):
        abs*=j
    sum+=abs
print(sum)

而应该是:

n=int(input())
sum=0 #求阶乘之和
for i in range(1,n+1):
    abs=1
    for j in range(1,i+1):
        abs*=j
    sum+=abs
print(sum)

 

 

我先不看上面他讲的,自己写一下:

ans=1
def facty():
    for i in range(1,x+1):
        ans=ans*i
    return ans
sum=0
for x in range(1,11):
    sum=sum+facty(x)
print(sum)



 写错了,但是自己看了半天没看出来错哪里了。和答案唯一区别在于我把第一行写在了函数体外面,答案是写在了函数体里面。

 六、采购问题(百钱百鸡问题)

最优解法:

5756d23ee323466ea685497522c29399.png

fbc5621273394f37b469837da984902c.png

bd37527684a948969e222cb3762e1882.png

七、

7.1输出指定*号图形(循环嵌套问题)

8482dad544e34fdeb545eac9143498af.png

 外层循环控制行数(负责换行),内层循环负责打印*号。通过观察我们可以发现,第几行就打印几个*号

n=int(input())
for i in range(1,n+1):
    for j in range(i):
        print("*",end="")
    print()

注意第二行,因为第三行中range()里面的数不能为0,所以第二行i要从1开始取值,所以为了能够输出n行,结尾应当为n+1。

n=eval(input())
for i in range(1,n+1):
    print(i*"*")

 第二行同理,应当把0去掉,取1,同时为了保证打印n次,结尾应当为n+1

7.2输出*圣诞树 

 

 

 

7.3 输出九九乘法表

6b4e64d994e2407d90f0e00fc12706d1.png

此乃我亲自所写 

for i in range(1,10):
    for j in range(1,i+1):
        print(f"{j}*{i}={i*j}",end=" ")
    print()

八、特殊的数

8.1水仙花数 

bf99993dae364a32a5ab0f72c81a5303.pnge2adfbacc7ac432884a64cb266878b57.png

不管给定的数字是几位数,要求个位数字的时候都是i%10

求十位的数字就是先对于10取整,然后再对于10取余

百,对于100取整,然后再对于10取余

千,对于1000取整,然后再对于10取余

。。。。。。。。。。。。。

for i in range(100,1000):
    a=i%10
    b=i//10%10
    c=i//100%10
    if i==a**3+b**3+c**3:
        print(i)

 8.2完美数(没完成)

十、找出素数(注意1不是素数)没完成

449ec1762cea487da9630b31f307e9c7.png

 自己写的:

L,R=map(int,input().split(" "))
for i in range(L,R+1):
    for j in range(2,i):
        if i%j!=0 and i!=1:
            print(i)

经典的错误,标准的零分。(目前没想明白哪里错了,先这个样吧。)

正确解法:

ee34c75d051d4837ba63f235514dfa51.png

看第14行,i不是有等于1的时候吗?那2不就大于一了???? 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的小白。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值