Python基础编程习题

  1. 警察局抓了a,b,c,d四名偷窃嫌疑犯,其中只有一人是小偷。审问中
    a说:“我不是小偷。”
    b说:“c是小偷。”
    c说:“小偷肯定是d。”
    d说:“c在冤枉人。”
    现在已经知道四个人中三人说的是真话,一人说的是假话,问到底谁是小偷?
    问题分析:将a, b, c, d将四个人进行编号,号码分别为1,2,3,4。则问题可用枚举尝试法来解决。
    算法设计:用变量x存放小偷的编号,则x的取值范围从1取到4,就假设了他们中的某人是小偷的所有情况。四个人所说的话就可以分别写成:
    a说的话:x!=1
    b说的话:x == 3
    c说的话:x==4
    d说的话:x != 4或not(x ==4)
    注意:在x的枚举过程中,当这四个逻辑式的值相加等于3时,即表示“四个人中三人说的是真话,一人说的是假话”。
    算法如下:
x=1
for x in range(2,4):
    if((x!=1)+(x==3)+(x==4)+(x!=4)==3):
        print(chr(64+x),"is a thief .");
  1. 判断一个4位整数是否为回文数
    问题分析:回文数例子,1221是回文数,因为其千位与个位互换,百位和十位互换后,仍是它本身
    计算模型:设输入数为n,则有
    (1)取出每一位的值
    n的千位:a=n//1000
    n的百位:b=n//100%10
    n的十位:c=n//10%10
    n的个位:d=n%10
    (2)构成逆序数
    m=d * 1000+b * 100+c * 10+a
    (3)n==m?
    代码如下:
n=input("请输入一个四位数:")
n=int(n)
a=n//1000
b=n//100%10
c=n//10%10
d=n%10
m=d*1000+c*100+b*10+a
result=(n==m)
print("回文数的判断结果是:", result)

  1. 判断是否为闰年
    问题分析:
    (1)能被4整除不能被100整除
    (2)能被400整除
    计算模型:设输入数为y,则有
    (1)y%4== 0 and y%100!=0
    (2)y%400==0
stry=input("请输入年份:")
y=int(stry)
result=(y%4==0 and y%100!=0) or (y%400==0)
print("闰年的判断结果为:",result)

  1. 将输入的字符转换为小写,并输出其ASCII值
    提示:
    条件表达式为 z if x else y
    获得字母的ASCII值函数ord()
    字符转换函数chr()
    大写字母为‘A ’~‘Z’
c=input("请输入一个字符:")
y=(c if(c>='a' and c<='z') else chr(ord(c)+32))
print("字符:",c,",ASCII:",ord(c),",转换为:", 
y,",ASCII:",ord(y))

  1. 汉诺(Hanoi)塔问题。
    在这里插入图片描述
def Hanoi(n,ch1,ch2,ch3):
    if n==1:
        print(ch1,'->',ch3)
    else:
        Hanoi(n-1,ch1,ch3,ch2)
        print(ch1,'->',ch3)
        Hanoi(n-1,ch2,ch1,ch3)

  1. 输入两个字符串,求两个字符串共有的最长子串
def substr():
    s1=input('输入子串1:')
    s2=input('输入子串2:')
    r=""
    m=0
    for i in range(0,len(s2)):
        for j in range(i+1,len(s2)+1):
            if s2[i:j] in s1 and m<j-i:
                r=s2[i:j]
                m=j-i
    print("最长公共的子串:",r)
substr()

  1. 输入一个点分IP地址,即输入形如***.***.***.***的字符串,其中 *** 为0~255之间的整数。编程将IP地址转化为32位二进制形式输出,也就是将 *** 转化为8位二进制数后依次连接起来形成32位二进制数
    【问题分析】判断是否为合法IP;将每个地址段转换为二进制数;重新拼接输出
def isVIP(L):
    if len(L)!=4:
        return False
    for i in range(4):
        if L[i].isdigit()==False or int(L[i])<0 or int(L[i])>255:
            return False
    return True
def _10to2(num):
    res=""
    while True:
        res=str(num%2)+res
        num=num//2
        if num==0:
            break
    while len(res)<8:
        res='0'+res
    return res
def _10to2(num):
    s=bin(num)
    res=s[2:len(s)+1].rjust(8,'0')
    return res
def main():
    ipS=input('input IP:')
    L=ipS.split('.')
    while not isVIP(L):
        print("IP is error!")
        ipS=input('input IP,again:')
        L=ipS.split('.')
    s=""
    for i in range(4):
        s=s+' '+_10to2(int(L[i]))
    print(s)
main()

  1. 已知平面上若干点的坐标是a0(1,2), a1(-1,3), a2(2,1.5), a3(-2,0), a4(4,2)。计算任意两的距离并生成距离矩阵,其中,矩阵元素(i, j)表示Ai和Aj之间的距离,最后输出距离矩阵和两点之间最大距离
from math import *
def d(x1,y1,x2,y2):
       return sqrt((x1-x2)**2+(y1-y2)**2)
def ma():
    x=[1,-1,2,-2,4]
    y=[2,3,1.5,0,2]
    dd=[]
    s=0
    for i in range(len(x)):
      dd.append([])
      for j in range(len(x)):
          v=d(x[i],y[i],x[j],y[j])
          dd[i].append(v)
          if s<dd[i][j]:
              s=dd[i][j]
    for i in range(len(x)):
        for j in range(len(x)):
            print("%5.2f"%dd[i][j],end="  ")
        print()
    print("max=%5.2f"%s)

  1. 输入一段英文文字,统计其中出现的英文单词及其出现次数。要求程序可以过滤掉常见的标点符号,并按下面要求输出:
    (1)将出现次数大于2的单词按字典序输出
    (2)将出现次数大于2的单词按单词出现次数从大到小排序输出
    [问题分析]本例的关键是分离单词,但首先要滤掉标点符号。过滤标点可以将常见标点全部 替换为空格或一种标点,然后按这种唯一的标点分离出每个单词。本例要求统计每个单 词的出现次数,可以用字典表示,单词是键,次数是值。
def ma():
    txt=input('input text:')
    wordC={}
    for e in " !;.\t\n\"()-:#@":
        txt=txt.replace(e,',')
    L=txt.split(',')
    L.sort()
   while L[0].isdigit() or L[0]=='':
        del L[0]
for e in L:
        if e in wordC:
            wordC[e]=wordC[e]+1
        else:
            wordC[e]=1
    print('按字典输出单词及次数(>2):')
    words=list(wordC.keys())
    words.sort()
for e in words:
        if wordC[e]>2:
            print(e,wordC[e])
    print('按字出现频率排序输出(>2):')
    L1=list(wordC.items())
    L1.sort(key=gN,reverse=True)
    for i in range(len(L1)):
        if L1[i][1]>2:
            print(L1[i][0],L1[i][1])
def gN(x):
    return x[1]

  1. 验证哥德巴赫猜想:任何一个超过2偶数都可以写成两个素数之和。
    问题分析:
    (1)将一个超过2偶数N,分解为两个数之和,如N=k1+k2,分别判断它是否为质数。
    (2)找出小于N所有素数,建立一个素数表L,取出一个素数e,判断N-e in L,若为真,则找到此合数素数分解
def pm():
    N=int(input("请输入待验证的偶数n(n>2):"))
    while N<3 or N%2==1:
        print('不符合要求!')
        N=int(input("请输入待验证的偶数n(n>2):"))
pme=set()
    for i in range(2,N+1):
        pme.add(i)
    for i in range(2,N+1):
        if i in pme:
            for k in range(2*i,N+1,i):
                if k in pme:
                    pme.remove(k)
for e in pme:
        f=N-e
        if f>=e and f in pme:
            print(N,'=',e,'+',f)

  1. 利用生成器构造一个fibonacci函数,生成fibonacci的小于100的数。
def fibonacci():
    a=b=1
    yield(a)
    yield(b)
    while True:
        a,b=b,a+b
        yield(b)
def m():
    for num in fibonacci():
        if num>100:
            break
        print(num, end=' ')

  1. 读取mp3歌词文件,将时间标签转换成毫秒形式,并将每一句歌词读出来,按时间顺序以“时间(毫秒为单位)歌词”的形式显示每一句
def readLRC(filename):
    with open(filename,'r') as f:
        res={}
        L=f.readline()
        while L!='':
            if(L[1:3].isdigit() and L[4:6].isdigit() and L[7:9].isdigit() and L[3]==':' and L[6]=='.'):
                t1=(int(L[1:3])*60+int(L[4:6]))*1000+int(L[7:9])*100
                res[t1]=L[10:].rstrip()
            L=f.readline()
        return res
def m():
    fname=input('输入MP3歌词文件名:')
    lrcD=readLRC(fname)
    for key in sorted(lrcD):
        print(key,lrcD[key])
m()

  1. 声明一个公民类,包括身份证号、姓名、年龄,声明学生类、教师类继承于公民类,学生类有学号、班级和成绩,教师类有工号、系别、薪水
class C:
    def __init__(self,id,name,age):
        self.id=id
        self.name=name
        self.age=age
    def __del__(self):
        print('bye') 
class S(C):
    def __init__(self,id,name,age,stdno,grade,score):
        super(S,self).__init__(id,name,age)
        self.stdno=stdno
        self.grade=grade
        self.score=score 
class T(C):
    def __init__(self,id,name,age,Thno,dept,sal):
        super(T,self).__init__(id,name,age)
        self.Thno=Thno
        self.dept=dept
        self.sal=sal

  1. 定义一个画图类的基本框架,抽象基类包括公共颜色和抽象类draw,子类点包括起点与终点、实现抽象方法draw,子类圆包括圆心与半径。
from abc import ABCMeta,abstractmethod
class S(object):
    __metaclass__=ABCMeta
    def __init__(self):
        self.color='black'
    @abstractmethod
    def draw(self):pass
class C(S):
    def __init__(self,x,y,r):
        self.x=x
        self.y=y
        self.r=r
    def draw(self):
        print('Draw circle:(%d, %d, %d)'%(self.x,self.y,self.r))
class Line(S):
    def __init__(self,x1,y1,x2,y2):
        self.x1=x1
        self.y1=y1
        self.x2=x2
        self.y2=y2
    def draw(self):
        print('Draw line:(%d, %d, %d,
%d)'%(self.x1,self.y1,self.x2,self.y2))
def f():
    c=C(10,10,5)
    l=Line(5,5,15,15)
    lst=[]
    lst.append(c)
    lst.append(l)
    for k in range(len(lst)):
        lst[k].draw()

  • 9
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值