这里使用了之前学习Java时,早期使用过的部分练习题,在这里直接使用python语言来做出来。
1.回文数
打印5位数中的所有回文数,每行打印10个数。最后统计一下一共有多少个5位回文数。
首先对一个数字的各个位进行拆分,方法有很多;
然后判断条件是否符合回文数;
由于需要每行打印10个,存在定期换行的操作,所以使用 flag 记录次数并进行操作,顺便用 cnt 做统计。
flag = 0
cnt = 0
for i in range(10000,100000):
ge = i%10
shi = (i%100-ge)/10
bai = (i%1000-shi*10-ge)/100
qian = round((i%10000-bai*100)/1000)
wan = round((i%100000-qian*1000)/10000)
if(ge==wan and shi==qian):
flag+=1
cnt+=1
if(flag<=10):
print(i,end=' ')
if(flag==10):
flag=0
print()
print('共有{0}个五位回文数'.format(cnt))
答案:共有900个
2.判断一个数字是否为回文数
与上述拆分数字位数的方法相同。写成了一个函数。
def is_huiwen(num):
ge = num%10
shi = (num%100-ge)/10
bai = (num%1000-shi*10-ge)/100
qian = round((num%10000-bai*100)/1000)
wan = round((num%100000-qian*1000)/10000)
if(num>=100000):
print('只能判断5位数及以下')
return
if(num>=10000 and num<=99999):
if(ge==wan and shi==qian):
print('{0}是回文数'.format(num))
return
else:
print('{0}不是回文数'.format(num))
return
if(num>=1000 and num<=9999):
if(ge==qian and shi==bai):
print('{0}是回文数'.format(num))
return
else:
print('{0}不是回文数'.format(num))
return
if(num>=100 and num<=999):
if(ge==bai):
print('{0}是回文数'.format(num))
return
else:
print('{0}不是回文数'.format(num))
return
else:
print('?')
return
3.水仙花数
"水仙花数"是指一个三位数,其各位数字的立方和等于该数本身。例如153是一个"水仙花数",因为153 = 1的三次方 + 5的三次方 + 3的三次方。
这类题的核心点就在于拆分数字各位数,所以类似的类型就不再做了。
cnt = 0
for i in range(100,1000):
ge = i%10
shi = (i%100-ge)/10
bai = (i%1000-shi*10-ge)/100
temp = ge**3 + shi**3 + bai**3
if(temp==i):
print(i,end=' ')
cnt+=1
print()
print('共有{0}个3位水仙花数'.format(cnt))
# 153 370 371 407
# 共有4个3位水仙花数
4.半人马之王
小时候看过的韩漫《幻想数学大战》里,代表数学中的“分数”的半人马怪物中,有个首领,它的血量是:1/2+1/4+1/8+1/16……设定里,只要能算出怪物血量就能打败怪物,但男主算不出来这个数,我们用python算一下。
(现在学会微积分了,能很简单地判断这个无穷项的数列之和收敛于1,但要知道,这个漫画是我小学二年级时看的,请不要笑话我)
def half_num(n):
# 第一个数是1/2
if(n==1):
return 1/(n+1)
# 后面是1/2^n
if(n>1 and n%1==0):
return 1/2**n + half_num(n-1)
这个方法的参数是指“前n项之和”,可以看到大概仅用50项左右,python的小数点位数就不够用了,项数再大就会直接返回1.0。
说明微积分知识没有骗我~
half_num(50) # 0.9999999999999991
half_num(60) # 1.0
5.冒泡排序
def maopao(list_in):
list_out = []
for i in range(len(list_in)):
for j in range(len(list_in)-1-i):
if(list_in[j]<list_in[j+1]):
list_in[j],list_in[j+1]=list_in[j+1],list_in[j]
return list_in