第1题
题目
输入一个数n,对其进行分解质因数:(提示:先构造一个2到n的质数的列表,然后从列表中找到最大那个可以去整除n的数,如果这个数是x的话,那么x加入列表2:让n=n/x在列表中找到最大的能够找到可以真出n (新的)的数x (新的),加入列表2如此反复循环,直到n为1为止)。假设n=22142,求n的所有质因数的和p,如果p的值小于等于1000,则打印2的p次方,如果p大于1000,则打印p
- 解题思路:
- 求所有质数小于n所有质数列表a
- 遍历列表a,求出n的质数’因子,将其装入列表b
- 求出b列表元素和,与1000比较大小
- 得出最终的结论
- 用法补充
- join用法:
- 格式:a.join(b) a为字符串,b为全部元素为字符串的元组,集合或列表
- 功能:遍历每一个元素,并按顺序用a字符串将它们连起来
- map用法:
- 格式:map(a,b) a表示要将元素转换的类型,b表示要转换的元组,集合或列表
- 功能:元组,集合,列表将每一个元素执行一定的操作
- 补充:如果要变成原来的数据结构,需要强制类型转换
代码
a="x"
b1=[1,2,3,4] #b中的元素是数值类型必须转换为字符串类型
b=list(map(str,b1)) #对b1中的元素执行str(b1[i]),强制类型转换的操作
a.join(b)
结果为:
解法1:间接法
- 说明: 一个数是否为x质数,只需要从2开始一直判断到x的平方根加1
import math
x=input("请输入整数")#输入一个数字
n=int(x)
zhishulist=[]
for i in range(2,n+1):#从2开始遍历,一直到n
flag=1 #flag作为一个判断符,判断i是否是因数
for j in range(2,int(math.sqrt(i)+1)):#优化:最大值为开方数加1
if i%j==0:#判断是否可以除尽,除尽则证明为非质数
flag=0
break
if flag==1:#如果为质数加入列表
zhishulist.append(i)
print(zhishulist)
zhishulist.reverse()#将列表倒置 由最大的开始除
yinzilist=[]
while n!=1:#n=1时表示
for i in zhishulist:#遍历
if n%i==0:#如果余数为0
yinzilist.append(i)#将因数加入到列表
n=n/i#除以最大因数
break
print(yinzilist)#打印因数表
p=sum(yinzilist)
if p>1000:
print("p=%d"%p)
else:
print("2**%d=%d"%(2**p,p))
解法2:直接法
- 说明:最小不可分解的因数是质因数,可以直接进行计算
x=eval(input("请输入一个整数"))#输入一个整数
y=x
li=[]
for i in range(2,int(x/2+1)): #由于从2开始一直到n,所以x的最大因子不超过int(x/2+1,当然最好为int(math.sqrt(x)+1))
if(x%i==0): #将因数加入列表中
li.append(i)
x=x/i #对x分解后,继续求x的因数
while(x%i==0): #如果判断当前的i是否还是x的因数,是则继续加入,循环
li.append(i)
x=x/i
if li==[]: #如果没有因数,就只有1和它本身
li=[1,y]
#打印输出一个因式分解的等式
p=list(map(str,li)) #将每一个元素由整型变成字符串类型
print("%d="%y+"x".join(p)) #在p的每一个字母间隔符之间加入一个符号,作为一个元素
print(p) #打印因式
print(li)
if sum(li)>1000:
print(sum(li))
else:
print(2**sum(li))
第2题
题目
输入一个日期(例如2008 01 12),求星期几,距离公元1年1月1日多少天,距离今天多少天
计算1750年4月2日到今天距离多天(正数),
- 用法补充
- datetime.datetime( )用来设置日期
- datetime.datetime.today获取今天的日期
- 如果d=datetime.datetime(2019,9,28)
那么d.tuple()表示用元组的形式返回日期
d.tuple()[:]表示在对其切片
d.tuple()[:][i]表示返回具体的某一个部分
print("第一问")
import datetime
x=input("请输入一个具体日期")
y=x.split()
d1=datetime.datetime(int(y[0]),int(y[1]),int(y[2]))
print("当天是星期%d"%(d1.timetuple()[:][6]+1))#对应的日期为第7个切片断,所以是[6],而且是从0开始记录星期一,所以要对应加1**加粗样式**
print("第二问")
d2=datetime.datetime.today()
d3=datetime.datetime(1,1,1)
d4=d2-d3
print("公元1年1月1日,距离今天一共有%d"%d4.days)#d4.days表示以天数为衡量单位
print("第三问")
d5=datetime.datetime(1750,4,2)
d6=d2-d5
print("公元1750年4月2日,距离今天一共有%d"%d6.days)
第3题
题目
输入一个字符串,然后提示输入1,2,3,4,5,6.
如果输入1,则将字符串大写(全体输出),
如果输入2,将字符串小写输出,
如果输入3,将字符串反输出序(例如一二三,则输出三二一)。
如果输入4,则构造回文( 例如输入一二三,则输出一二三三二一),
如果输入5则统计字符串中出现的字母的频率
如果输入6则退出
如果输入其他字母,则提示输入错误
- 相关用法:
1. x.upper():将字符串x中所有小写字母变成大写
2. x.lower():将字符串x中所有大写字母变成小写
3. x[::-1]:将字符串x用切片间隔为-1,将字符串x倒序
4. di.get(i,0):获取字典di中i键对应的值,如果没有返回0
5. di.keys():表示字典中所有键的集合
import string
x=input("请输入一个字符串")
print('''请输入1到6中的一个数字,执行以下功能:
1.将字符串大写输出
2.将字符串小写输出
3.将字符串反序输出
4.构造回文字符串输出
5.统计字符串中出现字母的频率
6.退出
''')
k=input("您输入的数是:")
k=int(k)
di={}
if k==1:
print("返回结果为:%s"%x.upper())
elif k==2:
print("返回结果为:%s"%x.lower())
elif k==3:
print("返回结果为:%s"%x[::-1])
elif k==4:
print("返回结果为:%s"%(x+x[::-1]))#回文=正序的x+倒序的x
elif k==5:
for i in x:
if i in string.ascii_letters: #ascii_letter表示含有所有字母的字符串
di[i]=di.get(i,0)+1 #统计每个字母出现的次数
for j in di.keys(): #计算每个字母的频率
di[j]=di[j]/len(x)
print("%s的频率为%f"%(j,di[j]))
elif k==6:
print("退出成功")
else:
print("输入错误")
第四题
爬取www.baidu.com,找出出现次数最多和最少的字母
import urllib.request
r=urllib.request.urlopen("http://www.baidu.com") #打开网页
s1=str(r.read()) #读取其中的字符并转化为字符串类型
di={}
for i in set(s1):
di[s1.count(i)]=i #记录键为出现的次数,值为字符
klist=list(di.keys()) #对键的集合进行排序
klist.sort(reverse=True) #倒序排列(大的放在前面)
print(di)
print(klist[0],di[klist[0]]) #打印出现次数最多的键值对
print(klist[len(klist)-1],di[klist[len(klist)-1]]) #打印出现次数最少的键值对