数据结构与算法 python语言实现 习题1.12答案

R-1.1 写一个函数判断n是否是m的倍数
需要注意的地方:不管用户输入的是什么input会将用户的输入转换为字符串如果想得到某种类型的内容需要进行强制类型转换

def is_multiple(n,m):
    if n % m==0:
        return True
    else:
        return False
n=(int)(input("请输入一个整数"))
m=(int)(input("请输入一个整数"))
print( is_multiple(n,m))

R-1.2 编写一个函数is_even(k)如果k为偶数返回true 但是函数中不能用乘法除法或取余
分析
通过位运算来判断一个数是否是偶数 将一个十进制整数转换为2进制数因为2进制数的高位都是
2的整次幂所以这个数是否是偶数取决于低位如果低位是0 则为偶数 如果低位是1则为奇数
例7的二进制是111 1是001 2是010则发现如果是奇数与1相与后必定是001 如果是偶数必定是000


def is_even(k):
      if(k&1):
         print("奇数")
      else:
        print("偶数")
k=(int)(input("请输入一个整数:"))
is_even(k)`

R-1.3 编写函数minmax(data),用来在数的序列中找到最大最小值,并以一个长度为2的元组的形式返回注意不能用内置函数max,min

def minmax(datas):
    num=[]
    max=datas[0]
    min=datas[0]
    for data in datas:
        if max<data:
            max=data
        if min>data:
            min=data
    num.append(min)
    num.append(max)
    return num
datas=[]
print("输入10个整数")
for i in range(0,10):
    j=(int)(input())
    datas.append(j)
num=minmax(datas)
print("最小值:"+ str(num[0]))
print("最大值:"+ str(num[1]))

R-1.4 编写一个python函数 用来接收正整数n,返回1到n的平方和

def calsquare(n):
     sum=0
     for i in range(1,n+1):
         sum+=(pow(i,2))
     return sum
n=(int)(input("请输入一个整数"))
sum=calsquare(n)
print(sum)

R-1.5 基于python内置函数sum对求1-n的平方和

n=(int)(input("请输入一个正整数"))
a=[]
for i in range(1,n+1):
    a.append(pow(i,2))
b=sum(a)
print(b)

R-1.6 编写一个函数接受n计算1-n中奇数的平方和和并返回

def oddsum(n):
    sum=0
    for i in range(1,n+1):
        if(i%2==1):
            sum+=pow(i,2)
    return sum
n=(int)(input("请输入一个整数"))
print("1-"+str(n)+"中奇数平方和和相加为"+str(oddsum(n)))

R-1.7 基于内置函数sum求1到n中奇数的平方和

num=[]
n=(int)(input("请输入一个整数"))
for i in range(1,n+1):
    if(i%2==1):
        num.append(pow(i,2))
print(num)
print(sum(num))

R-1.8 python 允许负整数作为序列的索引值,如一个长度为n的字符串s,当索引值-n<=k<0时,所指的元素为s[k],那么求一个正整数索引值j>=0,使得s[j]指向的也是相同的元素
答案 j=n+k
[1 2 3 4 5 6 7 8 9 10]
下标 0 1 2 3 4 5 6 7 8 9
该序列的长度为10
元素10而言它的负整数下标为-1
而 它的正整数下标为9
9=10+(-1)
R-1.9 要生成一个值为50,60,70,80的排列 求range构造函数的参数

num=[]
for i in range(50,90,10):
    num.append(i)
print(num)

R-1.10 要生成一个值为8,6,4,2,0,-2,-4,-6,-8的排列,求range构造函数的参数

ber=[]
for i in range(8,-10,-2):
    ber.append(i)
print(ber)

R-1.11 利用列表解析语法生成一个列表[1,2,4,8,16,32,64,128,256]
列表解析的基本语法为:[expr for iter_var in iterable]
基本使用 例>>> [i for i in range(0,8)] 结果[0,1,2,3,4,5,6,7]
还可以在循环后面添加判断语句 下面这个例子找出所有可以被2整除的数
[i for i in range(1,8) if i%2 == 0]
[2,4,6]

num=[pow(2,i) for i in range(0,9)]
print(num)

R-1.12 python的random模块包括一个函数choice(data),可以从一个非空序列返回一个随机元素.Random模块还包含一个更基本的randrange函数,参数化类似于内置的range函数,可以在给定范围内返回一个随机数.只使用randrange函数,
实现自己的choice函数

import random
def choice(data):
    j=random.randrange(0,len(data))
    return data[j]
data=[1,2,3,4,5,6,7,8,9,10]
j=choice(data)
print(j)

C-1.13 写一个函数逆置具有n个数的列表

def reverse(num):
    temp=0
    n=len(num)
    for i in range(0,n//2):
        temp=num[i]
        num[i]=num[n-1-i]
        num[n-1-i]=temp

num=[]
n=(int)(input("输入一个整数"))
while n!=0:
    num.append(n)
    n = (int)(input("输入一个整数"))
reverse(num)
print(num)

C-1.14 编写一个python函数,用来接收一个整数序列,并判断该序列中是否存在一对乘积是奇数的互不相同的数

def isexist(num):
    for i in range(0,len(num)-1):
        for j in range(i+1,len(num)):
            if num[i]!=num[j] and (num[i]*num[j])%2==1:
                return True
    return False

num = []
n=(int)(input("请输入一个整数"))
while n!=0:
    num.append(n)
    n = (int)(input("请输入一个整数"))
print(isexist(num))

C-1.15 编写一个python函数,用来接收一个数字序列,并判断是否所有的数字都互不相同

def isexist(num):
    for i in range(0,len(num)-1):
        for j in range(i+1,len(num)):
            if num[i]==num[j] :
                return False
    return True

num = []
n=(int)(input("请输入一个整数"))
while n!=0:
    num.append(n)
    n = (int)(input("请输入一个整数"))
print(isexist(num))

C-1.16 在1.5.1节scale函数的实现中,循环体内执行的命令data[j] =factor 我们已经说过这个数字类型是不可变的,操作符=在这种背景下使用的是创建了一个新的实例(而不是现有实例的变化).那么scale函数是如何实现改变调用者发送的实际参数呢

C-1.17 1.15节scale函数的实现如下。它能正常工作吗?请给出原因

def scale(data,factor):
for val in data :
val*=factor

C-1.18 演示如何使用Python列表解析语法来产生列表
[0,2,6,12,20,30,42,56,72,90]

分析:这种题其实就是找规律
2是2,6是2+4,12是2+4+6,20是2+4+6+8…根据下标来说0是第0项 2是第1项 每一项是以2为首项 2*i为尾项 公差为2的等差数列之和

num=[i*(2+2*i)//2 for i in range(0,10)]
print(num)

C-1.19 演示如何使用Python列表解析语法在不输入所有26个英文字母的情况下产生列表 [‘a’,‘b’,‘c’…‘z’]
解法就是简单的把字母的acill码值转换成字符型 但有个注意点就是python的字符型比较特殊和别的语言不太一样是chr

chars=[chr(i) for i in range(97,123)]
print(chars)

C-1.20 python的random模块包括一个函数shuffle(data),它可以接收一个元素的列表和一个随机的重新排列元素,以使每个可能的序列发生概率相等。random模块还包括一个更基本的函数randint(a,b),它可以返回一个从a到b(包括两个端点)的随机整数。只使用randint函数,实现自己的shuffle函数

import random
def shuffle(data):
    num=[]
    for i in range(0,len(data)):
        if len(data)>0:
            r=random.randint(0,len(data)-1)
            num.append(data[r])
            data.remove(data[r])
    return num
data=[2,3,1,4,5,6,7,8,9,10]
print(shuffle(data))

C-1.21 编写一个Python程序,反复从标准输入读取一行直到抛出EOFError异常,
然后以相反的顺序输出这些行(用户可以通过键按Ctrl+D结束输入)
C-1.22 编写一个Python程序,用来接收长度为n的两个整型数组a和b并返回数组a和b的点积也就是返回一个长度为n的数组c即c[i]=a[i].b[i]


def dot_product(a,b,n):
    c=[]
    for i in range(0,n):
        c.append(a[i]*b[i])
    return c
a=[1,2,3,4,5,6,7,8]
b=[1,2,3,4,5,6,7,8]
print(dot_product(a,b,8))

C-1.23 给出一个python代码片段的例子,编写一个索引可能越界的元素列表。如果索引越界,程序应该捕获异常结果并打印以下错误消息:
“Don’t try buffer overflow attacks in Python!”

C-1.24 编写一个python函数计算所给字符串中元音字母的个数

def vowelnum(strs):
    data=['a','e','i','o','u']
    num=0
    for i in range(0,len(strs)):
        if strs[i] in data:
            num=num+1
    return num
strs="absajsseiouuoisbjad"
print(vowelnum(strs))

C-1.25 编写一个python函数,接收一个表示一个句子的字符串s,然后返回该字符串的删除了所有标点符号的副本
注:python 中用ord函数将字符转换为数字
分析:我的理解是删除后的句子中只有大小写字母和空格

def delmark(strs):
    data=""
    for i in range(0,len(strs)):
        if (ord(strs[i])>=65 and ord(strs[i])<=90) or(ord(strs[i])>=97 and  ord(strs[i])<=122)or strs[i]==' ':
            data+=strs[i]
    return data
strs=input()
print(strs)
print(delmark(strs))

C-1.26 编写一个程序,需要从控制台输入3个整数a,b,c并确定它们是否可以在一个正确的算术公式(在给定的顺序)下成立 如"a+b=c" “a=b-c”,或"a*b=c"

def isright(a,b,c):
    if (a+b==c) or (a==b-c) or(a*b==c):
        return True
    else:
        return False
a=(int)(input())
b=(int)(input())
c=(int)(input())
print(isright(a,b,c))

C-1.28 在n维空间定义一个向量v=(v1,v2,…vn)的p范数,如下所示:||v||=(v1p+v2p+…+vnp)1/p对于p=2的特殊情况,这就成了传统的欧几里得范数,表示向量的长度.例如一个二维向量坐标为(4,3)的欧几里得范数为(42+32)1/2=(16+9)1/2=25^1/2=5.编写norm函数,即norm(v,p),返回向量v的p范数的值,norm(v),返回向量v的欧几里得范数.你可以假定v是一个数字列表

def norm1(v,p):
    sum=0
    for i in v:
        sum+=pow(i,p)
    sum=pow(sum,1/p)
    return sum
def norm2(v):
    sum=0
    for i in v:
        sum+=pow(i,2)
    sum=pow(sum,1/2)
    return sum
v=[1,2,3,4,5,6,7]
print(norm1(v,3))
print(norm2(v))

P-1.29 编写一个python程序,输出由字母’c’,‘a’,‘t’,‘d’,‘o’,'g’组成的所有可能的字符串(每一个字符只能出现一次)
分析:将6个字母全排列


def change(charactes,i,j):
    temp=characters[i]
    characters[i]=characters[j]
    characters[j]=temp
def permutation(characters,begin,end):
    str=''
    if(begin==end):
        for character in characters:
            str+=character
        print(str)
    else:
        for i in range(begin,end+1):
            change(characters,i,begin)
            permutation(characters,begin+1,end)
            change(characters, i,begin)
characters=['c','a','t','d','o','g']
permutation(characters,0,5)

P-1.30 编写一个python程序输入一个大于2的正整数,求将该数反复被2整除直到商小于2为止的次数

def divide(num):
    sum=0
    while num>=2:
        sum=sum+1
        num=num//2
    return sum
num=(int)(input("请输入一个大于2的整数"))
print("次数为:")
print(divide(num))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值