一、闰年问题
闰年:
1、能被4整除而不能被100整除
2、能被400整除(其实这个隐含了一个条件,那就是能被400整除的数,它必定能被4整除,然后我们综合条件1和条件2,可以求解。)
另外一种解法就是平铺直叙了,也比较容易想:
二、
2.1给定一天是一周的某一天,问n天之后是周几?
自己的解法:
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,从而使得关于天的循环只需要写一次就好了,比较巧妙。
三、特别数的和
错误解法:
基础思想是正确的,第6行错了
如果这样写的话就是恒真 :
这么表达就对啦!
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)
四、求两个数的最大公约数
注意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个数阶乘的和
思路很清晰明了,外层循环求和,内层循环求每个数的阶乘
切忌眼高手低,下图代码我自己写的,但是结果不对,因为第三行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)
写错了,但是自己看了半天没看出来错哪里了。和答案唯一区别在于我把第一行写在了函数体外面,答案是写在了函数体里面。
六、采购问题(百钱百鸡问题)
最优解法:
七、
7.1输出指定*号图形(循环嵌套问题)
外层循环控制行数(负责换行),内层循环负责打印*号。通过观察我们可以发现,第几行就打印几个*号
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 输出九九乘法表
此乃我亲自所写
for i in range(1,10):
for j in range(1,i+1):
print(f"{j}*{i}={i*j}",end=" ")
print()
八、特殊的数
8.1水仙花数
不管给定的数字是几位数,要求个位数字的时候都是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不是素数)没完成
自己写的:
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)
经典的错误,标准的零分。(目前没想明白哪里错了,先这个样吧。)
正确解法:
看第14行,i不是有等于1的时候吗?那2不就大于一了????