Python小型算法题集锦

#Python的一些算法练习题
每天做一些算法题

  • 1.质因数分解
  • 2.打印字母排列的菱形
  • 3.二分法查找对象
  • 4.回形取数
  • 5.方差
  • 6.分组问题
  • 7.字母统计

1.质因数分解

如435234=251171732

x=int(input('x='))
print(x,'=',end='')
for i in range(2,x):
	while(x!=1):
		if(x%i==0):
			print(i,'*',end='')
			x/=i
		else:
			break
print('\b ',end='')

为了省劲用了退格符
运行结果:

x=366054
366054 =2 *3 *13 *13 *19 *19

2.打印字母排列的菱形

输入
一个正整数m(1~26),表示菱形的半径(直径就是m*2+1)
输出
一个以m为半径的菱形,最外层是字母A,然后里一层是字母B,然后是C……依次排列

z=[chr(i) for i in range(65,91)]#生成一个26个大写字母的集合
m=int(input('请输入半经(1~26):'))
def sc(a,b,c):
	for i in range(a,b,c):
		for j in range(m-i):
			print(' ', end='')
		#打印空格
		for j in range(2*i+1):
			if j<(2*i+1)/2:
				print(z[j], end='')
			else:
				print(z[(2*i)-j], end='')
		print(' ')
		#打印字母
sc(0,m,1)#打印上半个菱形
sc(m-2,-1,-1)#打印下半个菱形

运行结果:

请输入半经(1~26)5
     A
    ABA
   ABCBA
  ABCDCBA
 ABCDEDCBA
  ABCDCBA
   ABCBA
    ABA
     A

3.二分法查找对象

输入一个有序的元素列表(必须有序),如果要查找的元素包含在其中,二分法查找返回其位置,否则返回None

def search(list,item):
	low=0
	high=len(list)-1
	while(low<=high):
		mid=round((low+high)/2)
		guess=list[mid]
		if(guess==item):
			return mid
		if(guess>item):
			high=mid-1
		else:
			low=mid+1
	return None
num=int(input('查找的对象:'))
L=[2,5,8,13,49,80]
print(search(L,num))

运行结果

查找的对象:13
3

4.回形取数

回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入第一行是两个不超过200的正整数m,n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出只有一行,共mn个数。为输入矩阵回形取数得到的结果。数之间用一一个空格分隔,行末不要有多余的空格。
eg:
输入
3 3
1 2 3
4 5 6
7 8 9
输出
1 4 7 8 9 6 3 2 5

matrix,result=[],[]
i,p=0,0
m,n=map(int,input().split())
#input().split()可在同一行对多个变量赋值
for _ in range(m):
    matrix.append(input().split())
	#对矩阵赋值
while p!=m*n:
    L,H=n-i-1,m-i-1
    for y in range(i,m-i):#向下取数
        result.append(matrix[y][i])
        p+=1
    for x in range(i+1,n-i):#向右取数
        result.append(matrix[H][x])
        p+=1
    for y in range(H-1,i-1,-1):#向上取数
        result.append(matrix[y][L])
        p+=1
    for x in range(L-1,i,-1):#向左取数
        result.append(matrix[i][x])
        p+=1
    i+=1
#当取得的数的个数与矩阵元素的个数相等时,循环结束
for m in range(p-1):
    print(result[m],end=' ')
print(result[p-1])
#输出

运行结果

5 6
2 8 4 9 6 5
4 1 3 4 8 9
2 6 4 8 1 7
5 3 6 8 2 1
9 4 8 7 6 1
2 4 2 5 9 4 8 7 6 1 1 7 9 5 6 9 4 8 1 6 3 6 8 2 1 8 4 3 4 8

5.方差

单纯的计算

def fangcha(List):
   return(sum(((float(sum(List))/len(List)-x)**2 for x in List))/len(List))

6.分组问题

任意数分三组,使得每组的和尽量相等

yu=[3, 8, 20, 15, 60, 1, 32]
c=yu[:3]
for x in range(3,len(yu)):
   c.sort()
   if(c[0]+c[1]>yu[x]):
      c[0]+=yu[x]
   else:
      c[0],c[1]=c[0]+c[1],yu[x]
print(c)

运行结果

[53, 26, 60]

得出来的并不是最优解,以后再改进

7.字母统计

输入一个字符串统计其中的每个字母的出现的次数(不区分大小写),并以垂直柱状图的形式输出

import string
s=input()
zm=[0]*26
small=string.ascii_lowercase
large=string.ascii_uppercase
'''
large,small=[]
large.append((chr(i)+ord('A')) for i in range(26))
small.append((chr(i)+ord('a')) for i in range(26))
'''
for i in range(len(s)):
	for x in range(26):
		if(s[i]==small[x] or s[i]==large[x]):
			zm[x]+=1
M=max(zm)
for i in range(M):
	m=max(zm)
	for j in range(26):
		if(zm[j]==m&m!=0):
			print('-',end='')
			zm[j]-=1
		else:
			print(' ',end='')
	print('')
for x in large:
	print(x,end='')

运行结果

aaaadddnnnnnppciyyyyzzzz
             -
-            -          --
-  -         -          --
-  -         - -        --
- --    -    - -        --
ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值