1.写一个函数,传入两个参数,第一个参数为底数,第二个参数为幂,返回底数的幂运算值
解:题目中要求求一个数的幂运算,但是没有说明给出的底数是整数还是小数,所以我们不能直接用int输入
def mi(n,m):
return float(float(n)**int(m))
n,m=input('请输入两个数:\n').split()
print('%g'%mi(n,m))
2.编写一个函数,分别统计出传入字符串参数(可以是多个参数)的英文,空格,数字和其他字符的个数,并打印出来
例如:
>>>count('Hello Wrold!','Hello Python')
第1个字符串有:10个英文,0个数字,1个空格,1个字符
第2个字符串有:11个英文,0个数字,1个空格,0个字符
解:这里用到了python中的可变长参数,在参数前加*将所有的参数,打包成元组
a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
b='0123456789'
def count(*c):
x,y,z,k=0,0,0,0
k=1
for i in c:
x,y,z,k=0,0,0,0
for j in i:
if a.find(j)!=-1:
x+=1
elif b.find(j)!=-1:
y+=1
elif j==' ':
z+=1
else:
k+=1
print('第{}个字符串有:{}个英文字母,{}个数字,{}个空格,{}个其他字符'.format(k,x,y,z,k))
k+=1
count('Hello World!','Hello Python')
3.求一个三位数,该三位数等于其每位数字的阶乘之和
解:直接打表,把1到9数字的阶乘全都存在一个列表中,然后直接判断即可
a=[]
def f():
a.append(0)
s=1
for i in range(1,10):
s*=i
a.append(s)
f()
for i in range(100,1000):
if a[i%10]+a[i//100]+a[i//10%10]==i:
print(i)
4.验证角谷猜想:任意给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数然后按照上面的法则继续计算,若干次后得到的结果必然为1。要求,读入一个自然数,输出计算步骤
def dg(n):
print(n)
if(n==1):
return
if n%2==0:
n//=2
dg(n)
else :
n=n*3+1
dg(n)
n=int(input('请输入一个整数:\n'))
dg(n)
5.一直两个完全平方三位数abc和xyz,其中a,b,c,x,y,z未必是不同的,而ax,by,cz是三个完全平方数。求abc和xyz
解:用木桶法,定义一个列表大小为100,100以内的凡是完全平方数等于1,否则等于0,然后for循环直接遍历所有的完全平方数,千万要注意,是遍历完全平方数,如果遍历所有三位数大大加强的运算时间,3位的完全平方数只有10到31,这样大大缩短时间,具体代码如下,不懂评论
x=[0]*100
def f():
for i in range(1,10):
x[i*i]=1
def dg(n,m):
if x[n%10*10+m%10] and x[n//100*10+m//100] and x[n//10%10*10+m//10%10]:
print(n,m)
f()
for i in range(10,32):
for j in range(10,31):
dg(i*i,j*j)
6.如果整数A的全部因子(包括1,不包括A本身)之和等于B,且整数B的全部因子(包括1,不包括B本身)之和等于A,并且AB不相等,则称A\B是一对亲密数。求3000以内的全部亲密数
题目思想:这个题很简单,定义一个求因子和的函数就行了
def yzsum(n):
s=0
for i in range(1,n):
if n%i==0:
s+=i
return s
for i in range(3,3001):
if i==yzsum(yzsum(i)) and i!=yzsum(i) and i<yzsum(i):#i<yzsum(i)的意思是避免输出两个一样的答案只是位置不同,例如a,b和b,a为一个答案
print(i,yzsum(i))
7.验证哥德巴赫猜想:任何一个大于6的偶数,都能分解成两个质数的和。要求输入一个整数,输出这个数能被分解成哪两个质数和。
解题思路:首先要明白如何判断质数,例如质数n,不用吧2到n-1全部遍历一遍,只用遍历2到根号n即可,python中math.sqrt()就是开根号,记得要将其变成整数,还要加头文件import math
import math
def ss(n):
s=int(math.sqrt(n))
for i in range(2,s+1):
if(n%i==0):
return False
return True
n=int(input('eg: '))
for i in range(3,n//2+1):
if ss(i) and ss(n-i):
print(n,'=',i,'+',n-i)
8.用递归方法解决汉诺塔问题,汉诺塔问题来自印度神话。上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着n片黄金圆盘。上帝命令婆罗门吧圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘.
读入n,输出移动顺序
def f(n,a,b,c):
if(n>0):
f(n-1,a,c,b)
print(a+'->'+c)
f(n-1,b,a,c)
n=int(input('请输入共有多少圆盘:\n'))
a,b,c='a','b','c'
f(n,a,b,c)